Button.MouseDown

Eu sou relativamente novo com o WPF. Estou tentando entender a diferença entre MouseDownEvent e PreviewMouseDownEvent.

Entendo as estratégias de eventos do WPF e entendo que o evento MouseDown é um evento de bolhas e o PreviewMouseDown é um evento de encapsulamento.

Também entendo a ordem em que esses eventos estão sendo disparados - de acordo com esta visão geral do MSDNhttp://msdn.microsoft.com/en-us/library/ms742806.aspx#routing (há um diagrama com exemplo lá).

Então eu tentei codificar um pouco, verifique isso por exemplo:

<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>

Eu tenho um manipulador de eventos para cada um dos eventos (a visualização e a não visualização) e eu queria ver o que está acontecendo, qual evento está sendo lançado (eu tenho uma caixa de mensagem mostrada para cada evento)

O controle de usuário 'MyButton' simplesmente estende o botão base e substitui OnMouseDown e OnPreviewMouseDown para definir o 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;
    }

(tentei com isso e sem isso).

De acordo com a visão geral do MSDN (no link acima), se eu tiver 3 elementos, a rota de eventos deverá ser a seguinte:

PreviewMouseDown (encapsulamento) no elemento raiz.

PreviewMouseDown (encapsulamento) no elemento intermediário # 1.

PreviewMouseDown (encapsulamento) no elemento de origem # 2.

MouseDown (bolha) no elemento de origem # 2.

MouseDown (bolha) no elemento intermediário # 1.

MouseDown (bolha) no elemento raiz.

Então eu esperava ocaixas de mensagem para ser mostrado de acordo com o acima. Por alguma razão - que eu não entendo apenas os eventos de visualização, estão sendo lançados (de acordo com o que o MSDN diz Preview_B1 => Preview_B2 => Preview_B3). Minhas expectativas eram: Preview_B1 => Preview_B2 => Preview_B3 => NonPreview_B3 => NonPreview_B2 => NonPreview_B1.

Mas os eventos de não visualização não estão sendo lançados.

Então, basicamente, eu não entendo a rota dos eventos. Na visão geral do MSDN, entendi que a rota começa a partir do elemento raiz, desce (encapsulamento) para o elemento de origem e depois volta (bolha) para o elemento raiz, mas isso não é o que está acontecendo na prática.

É realmente importante para mim entender como esses eventos estão funcionando. Provavelmente entendi algo básico aqui, sua ajuda será apreciada.

THANX !! -Gili

questionAnswers(4)

yourAnswerToTheQuestion