PreviewMouseDown не туннелирует как ожидалось - PullRequest
4 голосов
/ 18 июня 2011

У меня есть следующее дерево в моем приложении:

MainWindow (Window)
> LayoutRoot (Grid)
  > (MyCustomControl)
    > Item1 (Grid)
      > Button (Button1)

MyCustomControl наследуется от ItemsControl и отображает его элементы на StackPanel.

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

Что происходит: если я нажимаю внутри Button1, событие PreviewMouseDown проходит вдоль дерева, и OnPreviewMouseDown выполняется, как и ожидалось.Но если я нажимаю на Item1, событие PreviewMouseDown прекращается сразу после MainWindow и не достигает даже LayoutRoot.

Вот сведения о перенаправленном событии, которые я получил, используя Snoop :

Нажатие кнопки 1:

(Window)
> (Border)
  > (AdornerDecorator)
    > (ContentPresenter)
      > LayoutRoot (Grid)
        > (MyCustomControl)
          > (Border)
            > (StackPanel)
              > Item1 (Grid)
                > Button1 (Button)
                  > Chrome (ButtonChrome)

Нажатие элемента 1:

(Window)
> (Border)

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

Что мне здесь не хватает?

1 Ответ

5 голосов
/ 18 июня 2011

Вам необходимо убедиться, что ваш пользовательский элемент управления проверен на попадание.Если у вас есть ControlTemplate, такой как:

<ControlTemplate>
    <ItemsPresenter />
</ControlTemplate>

, тогда ваш пользовательский элемент управления не будет проверяться на попадание сам по себе.Даже если у вас есть ControlTemplate, такой как:

<ControlTemplate>
    <Border Background="{TemplateBinding Background}" ...>
        <ItemsPresenter />
    </Border>
</ControlTemplate>

Тогда, если Background имеет значение null, тогда ваш элемент управления сам по себе не будет проверяться на попадание.Если вы просто установите свойство Background в Transparent, то оно будет тестируемым на попадание.

Практическое правило: если ваш элемент управления или один из его потомков не визуализирует что-либо в заданном месте (то есть в пикселе),даже если он прозрачный, мышь не будет регистрировать для него события.

...