2010-03-29 14 views
6

Mam Adornera, który urzeka Granicę (zobacz zrzut ekranu poniżej). Event MouseDown dla Adornera jest jednak podnoszony tylko po kliknięciu elementu w adornerze. Potrzebuję zdarzenia MouseDown do podniesienia, klikając na dowolne miejsce w adornerze nad ozdobnym elementem. Jak to zrobić? Czy muszę dodać przejrzystą kontrolę w adornerze, czy jest na to inny sposób? Dzięki za pomoc!WPF: Adorner Hit Testing/MouseDown Event

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

Kodeks dla 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); 
    } 
} 

Odpowiedz

3

Kiedy robiłem to w przeszłości, zawsze używany przezroczysty pojemnik. Nie wystarczy mieć Szczotkę zerową; w rzeczywistości musisz użyć koloru # 00000000 (lub innego koloru alfa 0). Możesz wyłączyć IsHitTestVisible dla elementów w kontenerze, aby kontener mógł odbierać wszystkie zdarzenia w dół.

+0

dzięki za odpowiedź, ale jak ustawić pędzel na adornerze? drawingcontext i wypełnić cały rendersize? –

+0

ok, rozumiem (użyj rysunku rysunku, aby narysować przezroczysty prostokąt, nic specjalnego) i działa dobrze! Dziękuję Ci bardzo! wciąż zastanawiasz się, czy naprawdę potrzebujesz do tego dodatkowego prostokąta. tak czy inaczej, teraz po prostu działa. –

1

Problem polega na tym, że twój adorator może tylko podnosić zdarzenia myszy, gdy widoczne są elementy w twoim adoratorze ... dwa kwadraty w rogu.

Jeśli chcesz posłuchać mouseevents w całym elemencie, w którym się znajdujesz, powinieneś zarejestrować AdornedElement.PreviewMouseDown Daje to twojemu adoratorowi szansę na wykonanie swojej pracy, zanim zdarzenie MouseDown zostanie wystrzelone z ozdobnego elementu.

+0

cześć mike, próbowałem tego i dla mnie to nie działa? –