Button.MouseDown
Я относительно новичок в WPF. Я пытаюсь понять разницу между MouseDownEvent и PreviewMouseDownEvent.
Я понимаю стратегии событий WPF и понимаю, что событие MouseDown - это всплывающее событие, а PreviewMouseDown - это событие туннелирования.
Я также понимаю, в каком порядке запускаются эти события - согласно этому обзору MSDNhttp://msdn.microsoft.com/en-us/library/ms742806.aspx#routing (там есть схема с примером).
Поэтому я попытался написать кое-что сам, проверьте это, например:
<Grid x:Name="grid" Width="250">
<StackPanel Mouse.MouseDown="StackPanel_MouseDown" PreviewMouseDown="StackPanel_PreviewMouseDown">
<WPFVisualizerExample:MyButton x:Name="B1" PreviewMouseDown="B1_PreviewMouseDown" MouseDown="B1_MouseDown" Margin="5,5,5,5">
<WPFVisualizerExample:MyButton x:Name="B2" PreviewMouseDown="B2_PreviewMouseDown" MouseDown="B2_MouseDown" Margin="5,5,5,5">
<WPFVisualizerExample:MyButton x:Name="B3" PreviewMouseDown="B3_PreviewMouseDown" MouseDown="B3_MouseDown" Margin="5,5,5,5">Click Me</WPFVisualizerExample:MyButton>
</WPFVisualizerExample:MyButton>
</WPFVisualizerExample:MyButton>
</StackPanel>
</Grid>
У меня есть обработчик событий для каждого из событий (предварительный просмотр и предварительный просмотр), и я хотел посмотреть, что происходит, какое событие выбрасывается (у меня есть окно сообщения для каждого события).
Пользовательский элемент управления «MyButton» просто расширяет базовую кнопку и переопределяет OnMouseDown и OnPreviewMouseDown, чтобы установить значение e.Handled false:
protected override void OnMouseDown(System.Windows.Input.MouseButtonEventArgs e)
{
base.OnMouseDown(e);
e.Handled = false;
}
protected override void OnPreviewMouseDown(System.Windows.Input.MouseButtonEventArgs e)
{
base.OnPreviewMouseDown(e);
e.Handled = false;
}
(пробовал с этим и без этого).
Согласно обзору MSDN (по ссылке выше), если у меня есть 3 элемента, то маршрут событий должен быть следующим:
PreviewMouseDown (туннель) для корневого элемента.
PreviewMouseDown (туннель) на промежуточном элементе # 1.
PreviewMouseDown (туннель) для исходного элемента # 2.
MouseDown (пузырь) на элементе источника # 2.
MouseDown (пузырь) на промежуточном элементе # 1.
MouseDown (пузырь) на корневом элементе.
Так что я ожидалокна сообщений быть показано в соответствии с вышеизложенным. По какой-то причине, которую я не понимаю, генерируются только события предварительного просмотра (в соответствии с тем, что MSDN говорит Preview_B1 => Preview_B2 => Preview_B3). Мои ожидания были: Preview_B1 => Preview_B2 => Preview_B3 => NonPreview_B3 => NonPreview_B2 => NonPreview_B1.
Но события без предварительного просмотра вообще не генерируются.
Таким образом, в основном я не понимаю маршрут событий, из обзора MSDN я понял, что маршрут начинается от корневого элемента, идет вниз (туннель) к элементу источника, а затем обратно (пузырь) к корневому элементу, но это это не то, что происходит на практике.
Для меня очень важно понять, как работают эти события, я, наверное, не понимаю чего-то простого здесь, ваша помощь будет оценена.
СПАСИБО !! -Gili