我有两个关于 WPF 的列表视图。第一个列表视图加载了一个数据表。当从第一个列表视图中双击一个项目时,selectedItem 将移动到第二个列表视图。
由于从 DataTable 加载了很多元素,当在第一个列表视图中出现滚动条时,就会出现问题。如果选择一个项目并双击滚动条向下箭头,则启动 MouseDoubleClick 事件并将所选项目移动到第二个列表视图。
如何检测滚动条上的双击以防止这种情况发生?
非常感谢!
我有两个关于 WPF 的列表视图。第一个列表视图加载了一个数据表。当从第一个列表视图中双击一个项目时,selectedItem 将移动到第二个列表视图。
由于从 DataTable 加载了很多元素,当在第一个列表视图中出现滚动条时,就会出现问题。如果选择一个项目并双击滚动条向下箭头,则启动 MouseDoubleClick 事件并将所选项目移动到第二个列表视图。
如何检测滚动条上的双击以防止这种情况发生?
非常感谢!
我测试了上面非常有用的代码,但发现以下代码更稳定,因为有时源会被报告为 GridViewRowPresenter 而实际上你是双击一个项目。
var src = VisualTreeHelper.GetParent((DependencyObject)e.OriginalSource);
var srcType = src.GetType();
if (srcType == typeof(ListViewItem) || srcType == typeof(GridViewRowPresenter))
{
// Your logic here
}
private void ListBox_OnMouseDoubleClick(object pSender, MouseButtonEventArgs pE)
{
FrameworkElement originalSource = pE.OriginalSource as FrameworkElement;
FrameworkElement source = pE.Source as FrameworkElement;
if (originalSource.DataContext != source.DataContext)
{
logic here
}
}
当您拥有 DataContext 时,您可以轻松查看发件人是项目还是主列表框
在第一个 Listview 上的 MouseDoubleClick 事件中尝试此操作:
DependencyObject src = VisualTreeHelper.GetParent((DependencyObject)e.OriginalSource);
if(src is Control && src.GetType() == typeof(ListViewItem))
{
// Your logic here
}
基于此。
我在各种项目中使用它,它解决了您面临的问题。
我有最终的解决方案:
private void ListView_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
var originalSource = (DependencyObject)e.OriginalSource;
while ((originalSource != null) && !(originalSource is ListViewItem)) originalSource = VisualTreeHelper.GetParent(originalSource);
if (originalSource == null) return;
}
这个对我有用。