【问题标题】:Geometry HitTest UIElement in WPFWPF 中的几何 HitTest UIElement
【发布时间】:2012-07-31 09:06:17
【问题描述】:

有没有在 WPF 中使用 Geometry 来测试一个 uielement?我试过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;
}

【问题讨论】:

  • 你还没有说到底什么不起作用或你得到什么错误,但如果我假设一些事情,我会让你的示例代码运行。请参阅我编辑的答案。
  • 如果您使用转换,这个问题/答案可能有用:stackoverflow.com/questions/10451066/…

标签: wpf hittest uielement


【解决方案1】:

尝试使用VisualTreeHelper.HitTestGeometryHitTestParameters 作为hitTestParameters 参数。

了解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));
}

【讨论】:

  • 当然可以。你最好说“它对我不起作用”或“我无法让它起作用”。
  • 您或许可以解释一下您尝试使用 VisualTreeHelper 做什么,以及究竟什么没有按您的预期工作。
猜你喜欢
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多