using System; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Input; using LocalizationTool.Models; using LocalizationTool.Services; using LocalizationTool.ViewModels; namespace LocalizationTool { /// 主窗口:只负责视图(动态列、下拉同步、浏览对话框),业务全在 MainViewModel。 public partial class MainWindow { private readonly MainViewModel _vm; private bool _suppressLangSync; public MainWindow() { InitializeComponent(); Icon = App.AppIcon; _vm = new MainViewModel(); DataContext = _vm; _vm.LangOptionsChanged += RefreshLangCombo; _vm.SelectedLangsChanged += RebuildGrid; if (!Translation.Provider.IsConfigured) _vm.Stats = "提示:未配置翻译 API Key,可在“翻译设置”填写后再使用自动翻译。"; } /// 语言下拉选项变化:填充并默认全选(抑制回环触发)。 private void RefreshLangCombo() { _suppressLangSync = true; CmbTargetLangs.SelectedItems.Clear(); foreach (var o in _vm.LangOptions) CmbTargetLangs.SelectedItems.Add(o); _suppressLangSync = false; } /// 勾选变化 → 同步 ViewModel(表格列由 VM 的 SelectedLangsChanged 事件驱动重建)。 private void CmbTargetLangs_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (_suppressLangSync) return; _vm.SetSelectedLangs(CmbTargetLangs.SelectedItems .OfType() .Select(o => o.LanguageCode)); } private void BtnBrowse_Click(object sender, RoutedEventArgs e) { var dlg = new System.Windows.Forms.FolderBrowserDialog(); if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) _vm.LoadDirectory(dlg.SelectedPath); } /// 右键点击行时自动选中它(若点击行已在多选集合内则保留多选,供"删除选中行"批量使用)。 private void Grid_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) { var row = ItemsControl.ContainerFromElement(Grid, e.OriginalSource as DependencyObject) as DataGridRow; if (row != null && !Grid.SelectedItems.Contains(row.Item)) Grid.SelectedItem = row.Item; } /// 按勾选的语言动态生成表格列(序号 + 中文源文 + 语言列 + 缺译概览)。 private void RebuildGrid() { Grid.Columns.Clear(); Grid.Columns.Add(new DataGridTextColumn { Header = "#", Binding = new Binding(nameof(RowVm.Index)) { Mode = BindingMode.OneWay }, Width = DataGridLength.Auto, CanUserResize = false, IsReadOnly = true, }); Grid.Columns.Add(new DataGridTextColumn { Header = "中文源文", Binding = new Binding(nameof(RowVm.Key)) { Mode = BindingMode.OneWay }, Width = new DataGridLength(280), IsReadOnly = true, }); foreach (var lang in _vm.SelectedLangs) { var code = lang.LanguageCode; var column = new DataGridTextColumn { Header = $"{lang.LanguageName} ({code})", Binding = new Binding($"Cells[{code}].Value") { Mode = BindingMode.TwoWay }, Width = new DataGridLength(220), }; // 必须 BasedOn 全局(HandyControl)隐式样式,否则该列会退化成 WPF 原生模板, // 表现为译文文字靠上而不是像中文列那样垂直居中 var cellStyle = new Style(typeof(DataGridCell), Grid.TryFindResource(typeof(DataGridCell)) as Style); var trigger = new DataTrigger { Binding = new Binding($"Cells[{code}].HasIssue"), Value = true, }; trigger.Setters.Add(new Setter(DataGridCell.BorderBrushProperty, System.Windows.Media.Brushes.Red)); trigger.Setters.Add(new Setter(DataGridCell.BorderThicknessProperty, new Thickness(2))); cellStyle.Triggers.Add(trigger); column.CellStyle = cellStyle; var elementStyle = new Style(typeof(TextBlock), Grid.TryFindResource(typeof(TextBlock)) as Style); elementStyle.Setters.Add(new Setter(TextBlock.VerticalAlignmentProperty, VerticalAlignment.Center)); elementStyle.Setters.Add(new Setter( System.Windows.Controls.ToolTipService.ToolTipProperty, new Binding($"Cells[{code}].IssueMessage"))); column.ElementStyle = elementStyle; Grid.Columns.Add(column); } Grid.Columns.Add(new DataGridTextColumn { Header = "缺译", Binding = new Binding(nameof(RowVm.MissingText)) { Mode = BindingMode.OneWay }, Width = new DataGridLength(70), CanUserResize = false, IsReadOnly = true, }); } } }