| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- 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
- {
- /// <summary>主窗口:只负责视图(动态列、下拉同步、浏览对话框),业务全在 MainViewModel。</summary>
- 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,可在“翻译设置”填写后再使用自动翻译。";
- }
- /// <summary>语言下拉选项变化:填充并默认全选(抑制回环触发)。</summary>
- private void RefreshLangCombo()
- {
- _suppressLangSync = true;
- CmbTargetLangs.SelectedItems.Clear();
- foreach (var o in _vm.LangOptions) CmbTargetLangs.SelectedItems.Add(o);
- _suppressLangSync = false;
- }
- /// <summary>勾选变化 → 同步 ViewModel(表格列由 VM 的 SelectedLangsChanged 事件驱动重建)。</summary>
- private void CmbTargetLangs_SelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- if (_suppressLangSync) return;
- _vm.SetSelectedLangs(CmbTargetLangs.SelectedItems
- .OfType<LangOption>()
- .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);
- }
- /// <summary>右键点击行时自动选中它(若点击行已在多选集合内则保留多选,供"删除选中行"批量使用)。</summary>
- 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;
- }
- /// <summary>按勾选的语言动态生成表格列(序号 + 中文源文 + 语言列 + 缺译概览)。</summary>
- 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,
- });
- }
- }
- }
|