2010-03-29 8 views
6

Ich habe einen Adorner, der einen Border schmückt (siehe Screenshot unten). Das MouseDown Event für den Adorner wird jedoch nur ausgelöst, wenn man auf ein Element im Adorner klickt. Ich benötige das MouseDown Event, wenn ich auf einen beliebigen Ort im Adorner oberhalb des geschmückten Elements klicke. Wie kann das gemacht werden? Muss ich dem Adorner eine transparente Kontrolle hinzufügen oder gibt es dafür einen anderen Weg? Danke für jede Hilfe!WPF: Adorner Hit Testing/MouseDown Event

Screenshot und VS 2008 Projekt: http://cid-0432ee4cfe9c26a0.skydrive.live.com/browse.aspx/%C3%96ffentlich?uc=2

Der Code für die adorner:

class myAdorner : Adorner 
{ 
    public myAdorner(UIElement element) 
     : base(element) 
    { 
     this.MouseDown += new System.Windows.Input.MouseButtonEventHandler(myAdorner_MouseDown); 
    } 


    void myAdorner_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
    { 
     MessageBox.Show("ok"); 
    } 


    // Draws two rectangles: one in the upper-left and another one in the lower-right corner 
    protected override void OnRender(System.Windows.Media.DrawingContext drawingContext) 
    { 
     Size size = this.AdornedElement.RenderSize; 

     Rect r1 = new Rect(0.5, 0.5, 20, 20); 
     Rect r4 = new Rect(size.Width - 20.5, size.Height - 20.5, 20, 20); 


     SolidColorBrush brush = new SolidColorBrush(Colors.AliceBlue); 
     Pen pen = new Pen(Brushes.Black, 1); 

     drawingContext.DrawRectangle(brush, pen, r1); 
     drawingContext.DrawRectangle(brush, pen, r4); 
    } 
} 

Antwort

3

Als ich dies in der Vergangenheit getan habe, habe ich immer einen transparenten Behälter verwendet. Es ist nicht genug, um einen Null-Pinsel zu haben; Sie müssen tatsächlich die Farbe # 00000000 (oder eine andere Alpha 0 Farbe) verwenden. Sie können IsHitTestVisible für die Elemente innerhalb des Containers deaktivieren, sodass der Container alle Ereignisse empfängt, bei denen die Maustaste gedrückt wird.

+0

danke für deine Antwort, aber wie setzt du einen Pinsel auf einen Adorner? drawingcontext und fülle die ganze rendize? –

+0

ok, hab es (benutze einfach drawingcontext, um ein transparentes Rechteck zu zeichnen, nichts besonderes) und es funktioniert gut! vielen Dank! frage mich immer noch, ob du wirklich ein extra Rechteck dafür brauchst. Wie auch immer, es funktioniert jetzt einfach. –

1

Also das Problem ist, dass Ihr Adorner nur Mausereignisse auslösen kann, wo es sichtbare Elemente in Ihrem Adorner gibt ... die zwei Quadrate in der Ecke.

Wenn Sie während des gesamten Elements, das Sie schmücken möchten, nach Mouseevents Ausschau halten, sollten Sie sich registrieren AdornedElement.PreviewMouseDown Dies gibt Ihrem Adorner eine Chance, seine Arbeit zu erledigen, bevor das MouseDown-Ereignis vom geschmückten Element ausgelöst wird.

+0

hallo mike, habe ich das probiert und für mich funktioniert es nicht? –