从 VisualTreeHelper.HitTest 访问 FrameworkElement 的子类
本文关键字:子类 FrameworkElement 访问 VisualTreeHelper HitTest | 更新日期: 2023-09-27 17:56:01
我有一个自定义元素类,它是FrameworkElement
的子类。
public class MyCustomElement : FrameworkElement
{
private VisualCollection children;
public MyCustomElement()
{
this.children = new VisualCollection(this);
this.children.Add(MyDrawingRoutines());
}
private DrawingVisual MyDrawingRoutines()
{
//...
}
protected override int VisualChildrenCount
{
get { return children.Count; }
}
protected override Visual GetVisualChild(int index)
{
if (index < 0 || index >= children.Count)
{
throw new ArgumentOutOfRangeException();
}
return children[index];
}
}
UI 包含一个画布,其中添加了这些自定义绘图元素并执行命中测试。
public partial class MainWindow : Window
{
private MyCustomElement myCustomElement;
public MainWindow()
{
InitializeComponent();
myCustomElement = new MyCustomElement();
myCanvas.Children.Add(myCustomElement);
}
private void myCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
System.Windows.Point pt = e.GetPosition((UIElement)sender);
VisualTreeHelper.HitTest(this, null, new HitTestResultCallback(leftClickCallback), new PointHitTestParameters(pt));
}
public HitTestResultBehavior leftClickCallback(HitTestResult result)
{
if (result.VisualHit.GetType() == typeof(DrawingVisual))
{
if (((DrawingVisual)result.VisualHit).Opacity == 1.0)
{
((DrawingVisual)result.VisualHit).Opacity = 0.4;
}
else
{
((DrawingVisual)result.VisualHit).Opacity = 1.0;
}
}
return HitTestResultBehavior.Stop;
}
}
}
此代码按预期工作,但我找不到一种方法来确定检测到的 DrawingVisual 属于哪个 MyCustomElement。现在,不透明度调整只是表面上正确的吗?我想更改 MyCustomElement 上的不透明度属性,让 MyDrawingRoutines() 方法应用它,并且只在画布上绘制完成的 DrawingVisual。
您应该能够将 DrawingVisual 的 Parent 属性强制转换为 MyCustomElement 类:
public HitTestResultBehavior leftClickCallback(HitTestResult result)
{
var visual = result.VisualHit as DrawingVisual;
if (visual != null)
{
var element = visual.Parent as MyCustomElement;
if (element != null)
{
if (element.Opacity == 1.0)
{
element.Opacity = 0.4;
}
else
{
element.Opacity = 1.0;
}
}
}
return HitTestResultBehavior.Stop;
}
如果需要获取任何视觉对象的父级(不仅仅是具有如上所示的 Parent
属性的 ContainerVisual),可以使用 VisualTreeHelper.GetParent:
var visual = result.VisualHit;
var element = VisualTreeHelper.GetParent(visual) as MyCustomElement;