.net 检查是否在datagrid中双击滚动条
双击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.
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系统非常松散,这是实现这一事实的一个方面)。你看到这个帖子了吗?其中一个答案建议自上而下走相反的路:谢谢你,我不知道。