为什么 VisualTreeHelper return 按钮的边框
Why does the VisualTreeHelper return a border for a button
我正在使用 VisualTreeHelper
在看起来像这样的按钮上执行 HitTest
...
<Button Width="100"
Height="100"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Purple">
Hello world
</Button>
然而,当我这样执行实际的 HitTest 时:
HitTestResult result = VisualTreeHelper.HitTest(_ContentHolder, new Point(xTransform, yTransform));
if (result != null)
{
}
returned 对象看起来像这样 VisualHit = {System.Windows.Controls.Border}
,这对我来说不太有意义。
任何人都可以就我可能做错了什么、我如何 return 实际的 Button 对象(以便我可以触发任何事件处理程序)以及我为什么会遇到这种行为提供任何指导?
如果您查看按钮 here 的控件模板,您会发现它几乎完全由 Border 控件组成。由于 Border 是实际遭受打击的对象,因此 returned 也是如此。您应该使用一个通用的辅助函数在可视化树中向上移动以找到实际的按钮。
public static T FindParent<T>(DependencyObject child) where T : DependencyObject
{
//get parent item
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
//we've reached the end of the tree
if (parentObject == null) return null;
//check if the parent matches the type we're looking for
T parent = parentObject as T;
if (parent != null)
return parent;
else
return FindParent<T>(parentObject);
}
调用此函数,传递命中测试的结果并指定 Button
作为类型应该 return 被命中的父按钮。
现在...综上所述,您可能正以错误的方式尝试着做。如果没有更多关于您在做什么的详细信息,更重要的是为什么,可能很难指导您。
我正在使用 VisualTreeHelper
在看起来像这样的按钮上执行 HitTest
...
<Button Width="100"
Height="100"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Purple">
Hello world
</Button>
然而,当我这样执行实际的 HitTest 时:
HitTestResult result = VisualTreeHelper.HitTest(_ContentHolder, new Point(xTransform, yTransform));
if (result != null)
{
}
returned 对象看起来像这样 VisualHit = {System.Windows.Controls.Border}
,这对我来说不太有意义。
任何人都可以就我可能做错了什么、我如何 return 实际的 Button 对象(以便我可以触发任何事件处理程序)以及我为什么会遇到这种行为提供任何指导?
如果您查看按钮 here 的控件模板,您会发现它几乎完全由 Border 控件组成。由于 Border 是实际遭受打击的对象,因此 returned 也是如此。您应该使用一个通用的辅助函数在可视化树中向上移动以找到实际的按钮。
public static T FindParent<T>(DependencyObject child) where T : DependencyObject
{
//get parent item
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
//we've reached the end of the tree
if (parentObject == null) return null;
//check if the parent matches the type we're looking for
T parent = parentObject as T;
if (parent != null)
return parent;
else
return FindParent<T>(parentObject);
}
调用此函数,传递命中测试的结果并指定 Button
作为类型应该 return 被命中的父按钮。
现在...综上所述,您可能正以错误的方式尝试着做。如果没有更多关于您在做什么的详细信息,更重要的是为什么,可能很难指导您。