WPF: Adorner Hit Testing / MouseDown Event - PullRequest
6 голосов
/ 29 марта 2010

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

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

Код для рекламодателя:

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

Ответы [ 2 ]

3 голосов
/ 29 марта 2010

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

1 голос
/ 29 марта 2010

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

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

...