2012-07-31 117 views
0

有無論如何在WPF中使用幾何來測試元素嗎?我試過VisualTreeHelper,但它不起作用。 UIElement可能會引發鼠標向下的事件,如果鼠標用點擊它。WPF中的幾何HitTest 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; 
} 
+0

你還沒有說究竟是什麼不起作用,或者什麼樣的錯誤你會得到,但如果我假設一些事情,我會讓你的示例代碼運行。看到我編輯的答案。 – Clemens 2012-08-02 08:25:27

+0

如果你正在使用轉換,這個問題/答案可能是有用的:http://stackoverflow.com/questions/10451066/bug-in-geometry-hit-testing – 2013-08-21 07:33:23

回答

2

嘗試VisualTreeHelper.HitTestGeometryHitTestParametershitTestParameters說法。

閱讀關於Hit Testing in the Visual Layer

如果您只需要一個較大的鼠標輸入敏感區域,則可以在控件的可視化樹中添加透明形狀(例如圓形)。

編輯:你的示例代碼工作對我來說,只要我添加或承擔的幾件事情:

首先,在DrawRectangle的MyUI.OnRender()使用畫筆填充矩形。這也可以是一個透明的畫筆。

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

其次,results被初始化的地方:

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

三,消息框顯示一些明智的:

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

正如我所說。 VisualTreeHelper不起作用。 – user1184598 2012-07-31 09:44:56

+1

當然,它的工作原理。你應該更好地說「這對我不起作用」或者「我無法實現它」。 – Clemens 2012-07-31 09:46:38

+0

然後,它不適合我。 – user1184598 2012-08-01 09:22:37