WPF中的几何HitTest UIElement

时间:2012-07-31 09:06:17

标签: wpf hittest uielement

无论如何在WPF中使用Geometry测试一个元素?我试过了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;
}

1 个答案:

答案 0 :(得分:2)

hitTestParameters参数VisualTreeHelper.HitTest GeometryHitTestParameters进行尝试。

了解Hit Testing in the Visual Layer

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

编辑:您的示例代码适用于我,只要我添加或假设一些内容:

首先,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));
}