Button.MouseDown

Soy relativamente nuevo con WPF. Estoy tratando de entender la diferencia entre MouseDownEvent y PreviewMouseDownEvent.

Entiendo las estrategias de eventos de WPF y entiendo que el evento MouseDown es un evento burbujeante y el PreviewMouseDown es un evento de túnel.

También entiendo el orden en que se desencadenan estos eventos, de acuerdo con esta descripción general de MSDNhttp://msdn.microsoft.com/en-us/library/ms742806.aspx#routing (hay un diagrama con ejemplo allí).

Así que intenté codificar algo yo mismo, verifique esto, por ejemplo:

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

Tengo un controlador de eventos para cada uno de los eventos (la vista previa y la no vista previa) y quería ver qué está sucediendo, qué evento se está lanzando (Tengo un cuadro de mensaje para cada evento)

El control de usuario 'MyButton' simplemente extiende el botón base y anula OnMouseDown y OnPreviewMouseDown para configurar el 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;
    }

(Probé con esto y sin esto).

De acuerdo con la descripción general de MSDN (en el enlace anterior), si tengo 3 elementos, la ruta de eventos debería ser la siguiente:

PreviewMouseDown (túnel) en el elemento raíz.

PreviewMouseDown (túnel) en el elemento intermedio # 1.

PreviewMouseDown (túnel) en el elemento fuente # 2.

MouseDown (burbuja) en el elemento fuente # 2.

MouseDown (burbuja) en el elemento intermedio # 1.

MouseDown (burbuja) en el elemento raíz.

Así que esperaba que elcuadros de mensaje para ser mostrado de acuerdo a lo anterior. Por alguna razón, que no entiendo, solo se lanzan los eventos de vista previa (de acuerdo con lo que dice MSDN Preview_B1 => Preview_B2 => Preview_B3). Mis expectativas eran: Preview_B1 => Preview_B2 => Preview_B3 => NonPreview_B3 => NonPreview_B2 => NonPreview_B1.

Pero los eventos sin vista previa no se están lanzando en absoluto.

Entonces, básicamente, no entiendo la ruta de los eventos, desde la descripción general de MSDN entendí que la ruta comienza desde el elemento raíz, baja (túnel) al elemento fuente y luego retrocede (burbuja) al elemento raíz, pero esto No es lo que sucede en la práctica.

Es muy importante para mí entender cómo funcionan estos eventos, probablemente no entiendo algo básico aquí, su ayuda será apreciada.

GRACIAS !! -Gili

Respuestas a la pregunta(4)

Su respuesta a la pregunta