Я относительно новичок в WPF.
Я пытаюсь понять разницу между MouseDownEvent и PreviewMouseDownEvent.
Я понимаю стратегии событий WPF и понимаю, что событие MouseDown является пузырьковым событием, а PreviewMouseDown является туннельным событием.
Я также понимаю, в каком порядке запускаются эти события - в соответствии с этим обзором MSDN http://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 (tunnel) для исходного элемента №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