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

Ответы на вопрос(4)

Ваш ответ на вопрос