WPF中的几何图元
是否仍然可以在WPF中使用几何体命中测试uielement?我尝试了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
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));
}