.net 检查是否在datagrid中双击滚动条

.net 检查是否在datagrid中双击滚动条,.net,wpf,datagrid,double-click,hittest,.net,Wpf,Datagrid,Double Click,Hittest,双击DataGrid时,我需要我的应用程序执行特定操作。如果双击滚动条,则不应执行该操作。所以我试着看看双击是什么: private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e) { Point p = Mouse.GetPosition(this.DataGrid1); IInputElement ie = this.DataGrid1.

双击DataGrid时,我需要我的应用程序执行特定操作。如果双击滚动条,则不应执行该操作。所以我试着看看双击是什么:

private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            Point p = Mouse.GetPosition(this.DataGrid1);
            IInputElement ie = this.DataGrid1.InputHitTest(p);
        }
但当我双击一个滚动条时,IInputElement似乎是所有类型的东西: Microsoft.Windows.Themes.ScrollChrome或System.Windows.Shapes.Rectangle。所以我不确定我是否点击了滚动条


那么,如何检查我是否真的双击了滚动条?

这里不需要使用点击测试,只需通过遍历可视树检查
e.OriginalSource
是否有
滚动条类型的父项。这种方法有一个潜在的问题——必须加载UI元素,这通常是处理鼠标事件时的情况。下面是检查UIElement是否具有特定类型的父元素的代码

public static T GetParentOfType<T>(DependencyObject current)
          where T : DependencyObject
        {
            for (DependencyObject parent = VisualTreeHelper.GetParent(current);
                parent != null;
                parent = VisualTreeHelper.GetParent(parent))
            {
                T result = parent as T;

                if (result != null)
                    return result;
            }

            return null;
        }
公共静态T GetParentOfType(DependencyObject当前) 其中T:DependencyObject { 对于(DependencyObject parent=VisualTreeHelper.GetParent)(当前); 父项!=null; 父级=VisualTreeHelper.GetParent(父级)) { T结果=父代为T; 如果(结果!=null) 返回结果; } 返回null; }
此处不需要使用命中测试,只需通过遍历可视树检查
e.OriginalSource
是否有
滚动条类型的父级。这种方法有一个潜在的问题——必须加载UI元素,这通常是处理鼠标事件时的情况。下面是检查UIElement是否具有特定类型的父元素的代码

public static T GetParentOfType<T>(DependencyObject current)
          where T : DependencyObject
        {
            for (DependencyObject parent = VisualTreeHelper.GetParent(current);
                parent != null;
                parent = VisualTreeHelper.GetParent(parent))
            {
                T result = parent as T;

                if (result != null)
                    return result;
            }

            return null;
        }
公共静态T GetParentOfType(DependencyObject当前) 其中T:DependencyObject { 对于(DependencyObject parent=VisualTreeHelper.GetParent)(当前); 父项!=null; 父级=VisualTreeHelper.GetParent(父级)) { T结果=父代为T; 如果(结果!=null) 返回结果; } 返回null; }
谢谢你的回答!顺便说一下,如果双击一个文本单元格,则在e.OriginalSource中会得到一个TextBlock,VisualTreeHelper.GetParent会为其返回null。你知道为什么吗?@Bogdan0x400你传递的是什么类型的T?我不使用此代码,我只是在双击单元格时尝试VisualTreeHelper.GetParent(e.OriginalSource),它返回null,这让我感到惊讶。它不应该真的这样做,应该吗。在WPF中,Parent可以设置为几乎任何东西(与WinForms相比),它与可视化树没有任何关系(DP系统非常松散,这是实现这一事实的一个方面)。你看到这个帖子了吗?其中一个答案建议自上而下相反:谢谢你,我不知道。谢谢你的回答!顺便说一下,如果双击一个文本单元格,则在e.OriginalSource中会得到一个TextBlock,VisualTreeHelper.GetParent会为其返回null。你知道为什么吗?@Bogdan0x400你传递的是什么类型的T?我不使用此代码,我只是在双击单元格时尝试VisualTreeHelper.GetParent(e.OriginalSource),它返回null,这让我感到惊讶。它不应该真的这样做,应该吗。在WPF中,Parent可以设置为几乎任何东西(与WinForms相比),它与可视化树没有任何关系(DP系统非常松散,这是实现这一事实的一个方面)。你看到这个帖子了吗?其中一个答案建议自上而下走相反的路:谢谢你,我不知道。