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