using System.Collections.Generic; using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace DrillTools { /// /// ToolReorderConfirmationWindow.xaml 的交互逻辑 /// public partial class ToolReorderConfirmationWindow : Window { /// /// 是否确认重排 /// public bool IsConfirmed { get; private set; } /// /// 标记是否正在处理选中项同步,防止递归调用 /// private bool _isSynchronizingSelection = false; /// /// 构造函数 /// public ToolReorderConfirmationWindow() { InitializeComponent(); DataContext = new ToolReorderConfirmationViewModel(); } /// /// 使用原始和重排后的刀具列表初始化窗口 /// /// 原始刀具列表 /// 重排后刀具列表 public ToolReorderConfirmationWindow(IEnumerable originalTools, IEnumerable reorderedTools) : this() { if (DataContext is ToolReorderConfirmationViewModel viewModel) { viewModel.LoadTools(originalTools, reorderedTools); } } /// /// 确认按钮点击事件 /// private void ConfirmButton_Click(object sender, RoutedEventArgs e) { IsConfirmed = true; Close(); } /// /// 取消按钮点击事件 /// private void CancelButton_Click(object sender, RoutedEventArgs e) { IsConfirmed = false; Close(); } /// /// 原始刀序列表滚动事件处理 /// private void OriginalToolsListView_ScrollChanged(object sender, ScrollChangedEventArgs e) { if (sender is System.Windows.Controls.ListView listView && e.VerticalChange != 0) { // 获取原始列表的滚动位置 var scrollViewer = GetScrollViewer(listView); if (scrollViewer != null) { // 同步到重排后列表 var reorderedScrollViewer = GetScrollViewer(ReorderedToolsListView); if (reorderedScrollViewer != null) { reorderedScrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset); } } } } /// /// 重排后刀序列表滚动事件处理 /// private void ReorderedToolsListView_ScrollChanged(object sender, ScrollChangedEventArgs e) { if (sender is System.Windows.Controls.ListView listView && e.VerticalChange != 0) { // 获取重排后列表的滚动位置 var scrollViewer = GetScrollViewer(listView); if (scrollViewer != null) { // 同步到原始列表 var originalScrollViewer = GetScrollViewer(OriginalToolsListView); if (originalScrollViewer != null) { originalScrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset); } } } } /// /// 原始刀序列表选中项变化事件处理 /// private void OriginalToolsListView_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (_isSynchronizingSelection) return; try { _isSynchronizingSelection = true; if (OriginalToolsListView.SelectedItem is ToolOrderItem selectedOriginalItem) { // 在重排后列表中查找对应的刀具 var matchingItem = FindMatchingToolItem(ReorderedToolsListView, selectedOriginalItem); if (matchingItem != null) { ReorderedToolsListView.SelectedItem = matchingItem; // 确保选中的项可见 ReorderedToolsListView.ScrollIntoView(matchingItem); } } else { // 如果原始列表没有选中项,清空重排后列表的选中项 ReorderedToolsListView.SelectedItem = null; } } finally { _isSynchronizingSelection = false; } } /// /// 重排后刀序列表选中项变化事件处理 /// private void ReorderedToolsListView_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (_isSynchronizingSelection) return; try { _isSynchronizingSelection = true; if (ReorderedToolsListView.SelectedItem is ToolOrderItem selectedReorderedItem) { // 在原始列表中查找对应的刀具 var matchingItem = FindMatchingToolItem(OriginalToolsListView, selectedReorderedItem); if (matchingItem != null) { OriginalToolsListView.SelectedItem = matchingItem; // 确保选中的项可见 OriginalToolsListView.ScrollIntoView(matchingItem); } } else { // 如果重排后列表没有选中项,清空原始列表的选中项 OriginalToolsListView.SelectedItem = null; } } finally { _isSynchronizingSelection = false; } } /// /// 在ListView中查找匹配的刀具项 /// /// 要搜索的ListView /// 目标刀具项 /// 匹配的刀具项,如果未找到则返回null private ToolOrderItem FindMatchingToolItem(System.Windows.Controls.ListView listView, ToolOrderItem targetItem) { if (listView?.ItemsSource == null || targetItem == null) return null; foreach (var item in listView.Items) { if (item is ToolOrderItem toolItem) { // 使用与ViewModel中相同的匹配逻辑:基于孔径和刀具类型 // 注意:这里使用ToolTypeDisplay进行比较,因为ToolOrderItem中没有ToolType属性 if (Math.Abs(toolItem.Diameter - targetItem.Diameter) < 0.001 && toolItem.ToolTypeDisplay == targetItem.ToolTypeDisplay) { return toolItem; } } } return null; } /// /// 获取ListView中的ScrollViewer控件 /// /// ListView控件 /// ScrollViewer控件 private ScrollViewer GetScrollViewer(System.Windows.Controls.ListView listView) { if (listView == null) return null; // 使用VisualTreeHelper查找ScrollViewer for (int i = 0; i < VisualTreeHelper.GetChildrenCount(listView); i++) { var child = VisualTreeHelper.GetChild(listView, i); if (child is ScrollViewer scrollViewer) { return scrollViewer; } // 递归查找子控件 var result = GetScrollViewerFromChild(child); if (result != null) return result; } return null; } /// /// 从子控件中递归查找ScrollViewer /// /// 父控件 /// ScrollViewer控件 private ScrollViewer GetScrollViewerFromChild(DependencyObject parent) { if (parent == null) return null; for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) { var child = VisualTreeHelper.GetChild(parent, i); if (child is ScrollViewer scrollViewer) { return scrollViewer; } // 递归查找 var result = GetScrollViewerFromChild(child); if (result != null) return result; } return null; } } }