MainWindow.xaml.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using System;
  2. using System.Linq;
  3. using System.Windows;
  4. using System.Windows.Controls;
  5. using System.Windows.Data;
  6. using System.Windows.Input;
  7. using LocalizationTool.Models;
  8. using LocalizationTool.Services;
  9. using LocalizationTool.ViewModels;
  10. namespace LocalizationTool
  11. {
  12. /// <summary>主窗口:只负责视图(动态列、下拉同步、浏览对话框),业务全在 MainViewModel。</summary>
  13. public partial class MainWindow
  14. {
  15. private readonly MainViewModel _vm;
  16. private bool _suppressLangSync;
  17. public MainWindow()
  18. {
  19. InitializeComponent();
  20. Icon = App.AppIcon;
  21. _vm = new MainViewModel();
  22. DataContext = _vm;
  23. _vm.LangOptionsChanged += RefreshLangCombo;
  24. _vm.SelectedLangsChanged += RebuildGrid;
  25. if (!Translation.Provider.IsConfigured)
  26. _vm.Stats = "提示:未配置翻译 API Key,可在“翻译设置”填写后再使用自动翻译。";
  27. }
  28. /// <summary>语言下拉选项变化:填充并默认全选(抑制回环触发)。</summary>
  29. private void RefreshLangCombo()
  30. {
  31. _suppressLangSync = true;
  32. CmbTargetLangs.SelectedItems.Clear();
  33. foreach (var o in _vm.LangOptions) CmbTargetLangs.SelectedItems.Add(o);
  34. _suppressLangSync = false;
  35. }
  36. /// <summary>勾选变化 → 同步 ViewModel(表格列由 VM 的 SelectedLangsChanged 事件驱动重建)。</summary>
  37. private void CmbTargetLangs_SelectionChanged(object sender, SelectionChangedEventArgs e)
  38. {
  39. if (_suppressLangSync) return;
  40. _vm.SetSelectedLangs(CmbTargetLangs.SelectedItems
  41. .OfType<LangOption>()
  42. .Select(o => o.LanguageCode));
  43. }
  44. private void BtnBrowse_Click(object sender, RoutedEventArgs e)
  45. {
  46. var dlg = new System.Windows.Forms.FolderBrowserDialog();
  47. if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  48. _vm.LoadDirectory(dlg.SelectedPath);
  49. }
  50. /// <summary>右键点击行时自动选中它(若点击行已在多选集合内则保留多选,供"删除选中行"批量使用)。</summary>
  51. private void Grid_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
  52. {
  53. var row = ItemsControl.ContainerFromElement(Grid, e.OriginalSource as DependencyObject) as DataGridRow;
  54. if (row != null && !Grid.SelectedItems.Contains(row.Item))
  55. Grid.SelectedItem = row.Item;
  56. }
  57. /// <summary>按勾选的语言动态生成表格列(序号 + 中文源文 + 语言列 + 缺译概览)。</summary>
  58. private void RebuildGrid()
  59. {
  60. Grid.Columns.Clear();
  61. Grid.Columns.Add(new DataGridTextColumn
  62. {
  63. Header = "#",
  64. Binding = new Binding(nameof(RowVm.Index)) { Mode = BindingMode.OneWay },
  65. Width = DataGridLength.Auto,
  66. CanUserResize = false,
  67. IsReadOnly = true,
  68. });
  69. Grid.Columns.Add(new DataGridTextColumn
  70. {
  71. Header = "中文源文",
  72. Binding = new Binding(nameof(RowVm.Key)) { Mode = BindingMode.OneWay },
  73. Width = new DataGridLength(280),
  74. IsReadOnly = true,
  75. });
  76. foreach (var lang in _vm.SelectedLangs)
  77. {
  78. var code = lang.LanguageCode;
  79. var column = new DataGridTextColumn
  80. {
  81. Header = $"{lang.LanguageName} ({code})",
  82. Binding = new Binding($"Cells[{code}].Value") { Mode = BindingMode.TwoWay },
  83. Width = new DataGridLength(220),
  84. };
  85. // 必须 BasedOn 全局(HandyControl)隐式样式,否则该列会退化成 WPF 原生模板,
  86. // 表现为译文文字靠上而不是像中文列那样垂直居中
  87. var cellStyle = new Style(typeof(DataGridCell), Grid.TryFindResource(typeof(DataGridCell)) as Style);
  88. var trigger = new DataTrigger
  89. {
  90. Binding = new Binding($"Cells[{code}].HasIssue"),
  91. Value = true,
  92. };
  93. trigger.Setters.Add(new Setter(DataGridCell.BorderBrushProperty, System.Windows.Media.Brushes.Red));
  94. trigger.Setters.Add(new Setter(DataGridCell.BorderThicknessProperty, new Thickness(2)));
  95. cellStyle.Triggers.Add(trigger);
  96. column.CellStyle = cellStyle;
  97. var elementStyle = new Style(typeof(TextBlock), Grid.TryFindResource(typeof(TextBlock)) as Style);
  98. elementStyle.Setters.Add(new Setter(TextBlock.VerticalAlignmentProperty, VerticalAlignment.Center));
  99. elementStyle.Setters.Add(new Setter(
  100. System.Windows.Controls.ToolTipService.ToolTipProperty,
  101. new Binding($"Cells[{code}].IssueMessage")));
  102. column.ElementStyle = elementStyle;
  103. Grid.Columns.Add(column);
  104. }
  105. Grid.Columns.Add(new DataGridTextColumn
  106. {
  107. Header = "缺译",
  108. Binding = new Binding(nameof(RowVm.MissingText)) { Mode = BindingMode.OneWay },
  109. Width = new DataGridLength(70),
  110. CanUserResize = false,
  111. IsReadOnly = true,
  112. });
  113. }
  114. }
  115. }