2010-03-29 5 views
6

У меня есть Adorner, который украшает границу (см. Скриншот ниже). Событие MouseDown для Adorner, тем не менее, увеличивается только при нажатии на элемент в adorner. Мне нужно, чтобы событие MouseDown было поднято при нажатии на любое место в adorner над украшенным элементом. Как это может быть сделано? Должен ли я добавить прозрачный элемент управления в adorner или есть другой способ для этого? Спасибо за любую помощь!WPF: Adorner Hit Testing/MouseDown Event

Скриншот и VS 2008 Проект: http://cid-0432ee4cfe9c26a0.skydrive.live.com/browse.aspx/%C3%96ffentlich?uc=2

Кодекс для 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); 
    } 
} 

ответ

3

Когда я сделал это в прошлом, я всегда использовал прозрачный контейнер. Недостаточно иметь пустой кисть; вам действительно нужно использовать цвет # 00000000 (или некоторый другой цвет альфа 0). Вы можете отключить IsHitTestVisible для элементов внутри контейнера, чтобы контейнер получал все события мыши.

+0

спасибо за ваш ответ, но как вы накладываете кисть на рекламодателя? рисовать текст и заполнять всю визуализацию? –

+0

ok, получил его (просто используйте drawcontext для рисования прозрачного прямоугольника, ничего особенного), и он отлично работает! Большое спасибо! все еще задаваясь вопросом, действительно ли вам нужен дополнительный прямоугольник для этого. в любом случае, теперь это просто работает. –

1

Таким образом, проблема заключается в том, что ваш adorner только может вызывать события мыши, где в вашем adorner есть видимые элементы ... два квадрата в углу.

Если вы хотите прослушивать мышиные предметы по всему элементу, который вы украшаете, вам следует зарегистрироваться AdornedElement.PreviewMouseDown. Это даст вашему adorner возможность выполнить свою работу до того, как событие MouseDown будет выпущено украшенным элементом.

+0

привет майк, я пробовал это, и для меня это не работает? –

Смежные вопросы