254 lines
9.0 KiB
C#
254 lines
9.0 KiB
C#
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;
|
||
}
|
||
}
|
||
} |