Geometry HitTest UIElement in WPF



是否可以在WPF中使用Geometry来命中测试UI元素?我试过VisualTreeHelper,但它不起作用。如果鼠标点击某个点,UIElement可能会引发鼠标按下事件。

然而,如果几何体与UIElement相交,我想引发一个事件。我怎么能这么做?

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;
}

使用GeometryHitTestParameters为hitTestParameters参数尝试VisualTreeHelper.HitTest。

阅读视觉层中的命中测试。

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

编辑:如果我添加或假设一些内容,您的示例代码对我有效:

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

dc.DrawRectangle(Brushes.Transparent, null, new Rect(12, 12, 120, 120)); 

其次,results在某个地方初始化:

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

第三,MessageBox显示一些合理的东西:

if (results.Count > 0)
{
   MessageBox.Show(string.Format("Hit Count = {0}", results.Count));
}

相关内容

  • 没有找到相关文章

最新更新