我有一个标准的数据网格定义< Datagrid的...> 在这个数据网格中,我还有标准的" rowdetails",所以当点击datagrid中的一行时,会显示详细信息。一切都按预期工作。
但是,我在datagrid的每一行中都有一个<按钮..>在适当的位置,问题是,当点击按钮时,我不希望显示该行的详细信息。如果在任何其他位置单击该行,则应正确显示详细信息,但是当按下该按钮时,它应该仅执行按钮内容,但不显示该行的详细信息。
如何实现这一目标?
到目前为止,我尝试将PreviewMouseDown事件附加到按钮,然后在代码后面:
private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
var button = (Button) sender;
e.Handled = true;
}
这样可以正确防止在单击按钮时显示数据网格行详细信息,但它也会阻止按钮本身执行其附加的Click事件方法。
答案 0 :(得分:0)
在这里猜测:
单击鼠标按钮后,是否可以使行单击事件加速。例如,MouseClickUp而不是OnMouseClick。并且按钮甚至由OnMouseClick提升。也许然后首先调用按钮处理程序并解除行事件?
也许不是使用按钮你可以使用CellClick事件吗?
答案 1 :(得分:0)
您需要做的就是检查用户UIElement
在OnPreviewMouseDown
处理程序中实际点击的内容:
private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
IInputElement element = e.MouseDevice.DirectlyOver;
if (element != null && element is FrameworkElement)
{
Button button = GetParentOfType<Button>(element as FrameworkElement);
if (button != null)
{
// The Button was clicked
}
else e.Handled = true;
}
else e.Handled = true;
}
GetParentOfType
方法是一个简单的递归函数,它检查每个连续UIElement
的父类型,如果找到则返回预期的类型:
public T GetParentOfType<T>(DependencyObject element) where T : DependencyObject
{
Type type = typeof(T);
if (element == null) return null;
DependencyObject parent = VisualTreeHelper.GetParent(element);
if (parent == null && ((FrameworkElement)element).Parent is DependencyObject)
parent = ((FrameworkElement)element).Parent;
if (parent == null) return null;
else if (parent.GetType() == type || parent.GetType().IsSubclassOf(type))
return parent as T;
return GetParentOfType<T>(parent);
}