111 lines
3.8 KiB
C#
111 lines
3.8 KiB
C#
using Microsoft.Win32;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Threading;
|
|
|
|
namespace HashCalculator.GUI
|
|
{
|
|
/// <summary>
|
|
/// MainWindow.xaml 的交互逻辑
|
|
/// </summary>
|
|
public partial class MainWindow : Window
|
|
{
|
|
internal ViewModel ViewModel => (ViewModel)DataContext;
|
|
private bool _autoscroll = true;
|
|
|
|
public MainWindow()
|
|
{
|
|
InitializeComponent();
|
|
Translator.ProviderChanged += (s, e) => Dispatcher.Invoke(() =>
|
|
{
|
|
ViewModel.NotifyCsfChange();
|
|
});
|
|
ViewModel.ShowCopyableBox += ViewModel_ShowCopyableBox;
|
|
ViewModel.OpenFileDialog += ViewModel_OpenFileDialog;
|
|
ViewModel.ClearTracer += ViewModel_ClearTracer;
|
|
}
|
|
|
|
private void ViewModel_ShowCopyableBox(object? sender, ShowCopyableBoxEventArgs e)
|
|
{
|
|
var title = e.Title;
|
|
var getContent = e.GetContent;
|
|
e.Completion = Dispatcher.InvokeAsync(() =>
|
|
{
|
|
using var box = new CopyableBox(this, title, getContent);
|
|
box.ShowDialog();
|
|
}).Task;
|
|
}
|
|
|
|
private void ViewModel_OpenFileDialog(object? sender, OpenFileDialogEventArgs e)
|
|
{
|
|
var sdkRoot = new OpenFileDialog
|
|
{
|
|
Title = e.Title,
|
|
Filter = string.Join('|', e.Filters.Select(t =>
|
|
{
|
|
if (t.Description is null)
|
|
{
|
|
return $"{t.Extension}|{t.Extension}";
|
|
}
|
|
return $"{t.Description} ({t.Extension})|{t.Extension}";
|
|
}))
|
|
};
|
|
e.Result = Dispatcher.InvokeAsync(() => sdkRoot.ShowDialog(this) is not true ? null : sdkRoot.FileName).Task;
|
|
}
|
|
|
|
private void OnButtomScrollViewerScrollChanged(object sender, ScrollChangedEventArgs e)
|
|
{
|
|
var scrollViewer = (ScrollViewer)sender;
|
|
// User scroll event : set or unset auto-scroll mode
|
|
if (e.ExtentHeightChange == 0)
|
|
{ // Content unchanged : user scroll event
|
|
if (scrollViewer.VerticalOffset == scrollViewer.ScrollableHeight)
|
|
{ // Scroll bar is in bottom
|
|
// Set auto-scroll mode
|
|
_autoscroll = true;
|
|
}
|
|
else
|
|
{ // Scroll bar isn't in bottom
|
|
// Unset auto-scroll mode
|
|
_autoscroll = false;
|
|
}
|
|
}
|
|
|
|
// Content scroll event : auto-scroll eventually
|
|
if (_autoscroll && e.ExtentHeightChange != 0)
|
|
{ // Content changed and auto-scroll mode set
|
|
// Autoscroll
|
|
scrollViewer.ScrollToVerticalOffset(scrollViewer.ExtentHeight);
|
|
}
|
|
}
|
|
|
|
private void OnInitialized(object sender, EventArgs e)
|
|
{
|
|
TracerListener.DataAvailaible += delegate
|
|
{
|
|
Dispatcher.InvokeAsync(() =>
|
|
{
|
|
if (TracerListener.GetText() is not { Length: > 0 } text)
|
|
{
|
|
return;
|
|
}
|
|
LogPrefix.Visibility = Visibility.Visible;
|
|
LogText.AppendText(text);
|
|
ClearLogs.Visibility = Visibility.Visible;
|
|
});
|
|
};
|
|
}
|
|
|
|
private void ViewModel_ClearTracer(object? sender, EventArgs e)
|
|
{
|
|
LogPrefix.Visibility = Visibility.Collapsed;
|
|
LogText.Clear();
|
|
ClearLogs.Visibility = Visibility.Collapsed;
|
|
}
|
|
}
|
|
}
|