Files
AohDrllTools/ToolReorderConfirmationWindow.xaml.cs
2025-12-15 20:53:20 +08:00

254 lines
9.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace DrillTools
{
/// <summary>
/// ToolReorderConfirmationWindow.xaml 的交互逻辑
/// </summary>
public partial class ToolReorderConfirmationWindow : Window
{
/// <summary>
/// 是否确认重排
/// </summary>
public bool IsConfirmed { get; private set; }
/// <summary>
/// 标记是否正在处理选中项同步,防止递归调用
/// </summary>
private bool _isSynchronizingSelection = false;
/// <summary>
/// 构造函数
/// </summary>
public ToolReorderConfirmationWindow()
{
InitializeComponent();
DataContext = new ToolReorderConfirmationViewModel();
}
/// <summary>
/// 使用原始和重排后的刀具列表初始化窗口
/// </summary>
/// <param name="originalTools">原始刀具列表</param>
/// <param name="reorderedTools">重排后刀具列表</param>
public ToolReorderConfirmationWindow(IEnumerable<ToolItem> originalTools, IEnumerable<ToolItem> reorderedTools) : this()
{
if (DataContext is ToolReorderConfirmationViewModel viewModel)
{
viewModel.LoadTools(originalTools, reorderedTools);
}
}
/// <summary>
/// 确认按钮点击事件
/// </summary>
private void ConfirmButton_Click(object sender, RoutedEventArgs e)
{
IsConfirmed = true;
Close();
}
/// <summary>
/// 取消按钮点击事件
/// </summary>
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
IsConfirmed = false;
Close();
}
/// <summary>
/// 原始刀序列表滚动事件处理
/// </summary>
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);
}
}
}
}
/// <summary>
/// 重排后刀序列表滚动事件处理
/// </summary>
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);
}
}
}
}
/// <summary>
/// 原始刀序列表选中项变化事件处理
/// </summary>
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;
}
}
/// <summary>
/// 重排后刀序列表选中项变化事件处理
/// </summary>
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;
}
}
/// <summary>
/// 在ListView中查找匹配的刀具项
/// </summary>
/// <param name="listView">要搜索的ListView</param>
/// <param name="targetItem">目标刀具项</param>
/// <returns>匹配的刀具项如果未找到则返回null</returns>
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;
}
/// <summary>
/// 获取ListView中的ScrollViewer控件
/// </summary>
/// <param name="listView">ListView控件</param>
/// <returns>ScrollViewer控件</returns>
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;
}
/// <summary>
/// 从子控件中递归查找ScrollViewer
/// </summary>
/// <param name="parent">父控件</param>
/// <returns>ScrollViewer控件</returns>
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;
}
}
}