using Microsoft.Win32; using System; using System.IO; using System.Threading; using System.Windows; namespace AnotherReplayReader { public sealed class DebugMessageWrapper { public readonly struct Proxy { public readonly string Payload; public Proxy(string text) { Payload = text; } public static Proxy operator +(Proxy p, string text) { return string.IsNullOrEmpty(p.Payload) ? new Proxy(text) : new Proxy(p.Payload + text); } } public event Action? NewText; public Proxy DebugMessage { get => new Proxy(); set => NewText?.Invoke(value.Payload); } public event Action? RequestedSave; public void RequestSave() => RequestedSave?.Invoke(); } /// /// Debug.xaml 的交互逻辑 /// public sealed partial class Debug : Window { public static readonly DebugMessageWrapper Instance = new DebugMessageWrapper(); private static Debug? _window = null; public static void Initialize() { Interlocked.CompareExchange(ref _window, new(), null); _window.InitializeComponent(); Instance.NewText += _window.AppendText; Instance.RequestedSave += _window.ExportInMainWindow; } public static new void ShowDialog() => (_window as Window)?.ShowDialog(); private Debug() { } private void OnExport_Click(object sender, RoutedEventArgs e) => Export(this); private void OnClear_Click(object sender, RoutedEventArgs e) => _textBox.Clear(); private void AppendText(string s) => Dispatcher.Invoke(() => _textBox.AppendText(s)); private void ExportInMainWindow() => Export(Application.Current.MainWindow); private void Export(Window owner) { Dispatcher.Invoke(() => { var saveFileDialog = new SaveFileDialog { Filter = "文本文档 (*.txt)|*.txt|所有文件 (*.*)|*.*", OverwritePrompt = true, }; var result = saveFileDialog.ShowDialog(owner); if (result == true) { using (var file = saveFileDialog.OpenFile()) using (var writer = new StreamWriter(file)) { writer.Write(_textBox.Text); } } }); } } }