0

WPF で Geometry を使用して uielement をヒット テストする方法はありますか? 試してみVisualTreeHelperましたが、うまくいきません。UIElementマウスがポイントでクリックすると、マウスダウンイベントが発生する可能性があります。

ただし、ジオメトリが an と交差した場合にイベントを発生させたいと考えてい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;
}
4

1 に答える 1

2

引数にGeometryHitTestParametersを指定してVisualTreeHelper.HitTestを試してください。hitTestParameters

ビジュアル レイヤーでのヒット テストについてお読みください。

マウス入力の感知領域を大きくするだけでよい場合は、コントロールのビジュアル ツリーに透明な形状 (円など) を追加できます。

編集:いくつかのことを追加または想定する場合、サンプルコードは私のために機能します:

まず、MyUI.OnRender() の DrawRectangle は、Brush を使用して四角形を塗りつぶします。これは、透明なブラシの場合もあります。

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

次に、resultsどこかで初期化されます。

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

3 番目に、MessageBox は適切なものを表示します。

if (results.Count > 0)
{
   MessageBox.Show(string.Format("Hit Count = {0}", results.Count));
}
于 2012-07-31T09:23:44.353 に答える