WPF中的几何图元

WPF中的几何图元,wpf,hittest,uielement,Wpf,Hittest,Uielement,是否仍然可以在WPF中使用几何体命中测试uielement?我尝试了VisualTreeHelper,但它不起作用UIElement如果鼠标点击某个点,可能会引发鼠标按下事件 但是,如果几何体与ui元素相交,我想引发一个事件。我怎么能这样做 public class MyUI : UIElement { protected override void OnReder(DrawingContext dc) { dc.DrawRectangle(..., new Re

是否仍然可以在WPF中使用几何体命中测试uielement?我尝试了
VisualTreeHelper
,但它不起作用
UIElement
如果鼠标点击某个点,可能会引发鼠标按下事件

但是,如果几何体与
ui元素
相交,我想引发一个事件。我怎么能这样做

public class MyUI : UIElement
{
    protected override void OnReder(DrawingContext dc)
    {
        dc.DrawRectangle(..., new Rect(12,12,120,120));
        ...
    }
}

MyUI ui = new MyUI();
Grid grid = new Grid();
grid.Children.Add(ui);

EllipseGeometry eg = new EllipseGeometry(new Rect(24,24,40,40));

VisualTreeHelper.HitTest(grid, null, HitTestResult, new GeometryHitTestParameters(eg));

if (results.Count > 0)
    MessageBox.Show("Hit Count = "+results.ToString());

...

List<DependencyObject> results;

public HitTestResultBehavior HitTestResult(HitTestResult result)
{
    results.Add(result.VisualHit);
    return HitTestResultBehavior.Continue;
}
公共类MyUI:UIElement
{
受保护的覆盖无效OnReder(DrawingContext dc)
{
dc.DrawRectangle(…,新Rect(12,12120120));
...
}
}
MyUI=新的MyUI();
网格=新网格();
grid.Children.Add(ui);
椭圆梯度法eg=新椭圆梯度法(新Rect(24,24,40,40));
HitTest(grid、null、HitTestResult、新GeometryHitTestParameters(eg));
如果(results.Count>0)
Show(“Hit Count=“+results.ToString());
...
列出结果;
公共HitTestResultBehavior HitTestResult(HitTestResult结果)
{
results.Add(result.VisualHit);
返回HitTestResultBehavior。是否继续;
}
尝试为
hitTestParameters
参数使用一个

了解

如果您只需要一个更大的敏感区域来进行鼠标输入,则可以在控件的视觉树中添加一个透明形状(例如,一个圆)

编辑:如果我添加或假设了以下几点,那么您的示例代码对我很有用:

首先,MyUI.OnRender()中的DrawRectangle使用画笔填充矩形。这也可以是一个透明的笔刷

dc.DrawRectangle(Brushes.Transparent, null, new Rect(12, 12, 120, 120)); 
其次,
结果
在某个地方初始化:

private List<DependencyObject> results = new List<DependencyObject>();

这当然有效。你最好说“它对我不起作用”或“我无法让它工作”。你也许可以解释一下你试图用VisualTreeHelper做什么,以及什么没有按照你的预期工作。你仍然没有说什么不起作用或出现什么错误,但如果我假设一些事情,我会让你的示例代码运行。请参阅我编辑的答案。如果您正在使用转换,此问题/答案可能有用:
if (results.Count > 0)
{
   MessageBox.Show(string.Format("Hit Count = {0}", results.Count));
}