2010-12-09 16 views
2

Ich habe eine Leinwand und es hat Kind DrawingVisuals in seiner VisualCollection. Ich will einen Test gegen eine Art von Kind, aber nicht für andere. Zu tun, dass ich HitTestFilterCallback Funktion schrieb:WPF - Hit Test Filter Callback

public HitTestFilterBehavior MyHitTestFilter(DependencyObject o) 
{ 
    Debug.WriteLine(o.GetType()); 
    if (o is BackgroundLine) 
    { 
     return HitTestFilterBehavior.ContinueSkipSelf; 
    } 
    else 
    { 
     return HitTestFilterBehavior.Continue; 
    } 
} 

So überprüfe ich, ob das Kind von Leinwand ein BackgroundLine ist, die von DrawingVisual abgeleitet ist, und wenn es ich es überspringen. Der Typ, den ich von Debug.WriteLine (o.GetType()) bekomme, ist jedoch nur System.Windows.Media.DrawingVisual. Gibt es eine Möglichkeit, den spezifischsten Objekttyp zu finden?

Der Rest des Codes ist unten. Ich möchte nur gegen GraphicsBase-Objekte testen.

GraphicsBase hit = null; 
public HitTestResultBehavior MyHitTestResult(HitTestResult result) 
{ 
    hit = (GraphicsBase)result.VisualHit; 

    return HitTestResultBehavior.Stop; 
} 

    VisualTreeHelper.HitTest(drawingCanvas, new HitTestFilterCallback(MyHitTestFilter), 
new HitTestResultCallback(MyHitTestResult), new PointHitTestParameters(point)); 

if (hit != null) 
    Debug.WriteLine("hit"); 
else 
    Debug.WriteLine("nothing"); 
+0

können Sie einen Code teilen, der 'MyHitTestFilter' aufruft? – TarasB

+0

Wovon stammt BackgroundLine? – rooks

+0

Sowohl BackgroundLine als auch GraphicsBase werden von DrawingVisual abgeleitet. drawingCanvas enthält nur Objekte dieser 2 Klassen. –

Antwort

0

Ich habe das Problem gefunden. Das DrawingVisual-Objekt, das ich sehe, war das Rechteck, das ich für die Hintergrundfarbe hinzugefügt habe. Ich habe das vergessen und dachte, ich würde den BackgroundLine-Objekttyp als DrawingVisual bekommen. Ich kann den spezifischen BackgroundLine-Typ erhalten, wie Rooks sagten. Vielen Dank.