Button.MouseDown

Ich bin relativ neu bei WPF. Ich versuche den Unterschied zwischen MouseDownEvent und PreviewMouseDownEvent zu verstehen.

Ich verstehe die WPF-Ereignisstrategien und ich verstehe, dass das MouseDown-Ereignis ein sprudelndes Ereignis und das PreviewMouseDown-Ereignis ein Tunneling-Ereignis ist.

Ich verstehe auch die Reihenfolge, in der diese Ereignisse ausgelöst werden - gemäß dieser MSDN-Übersichthttp: //msdn.microsoft.com/en-us/library/ms742806.aspx#routin (dort gibt es ein Diagramm mit Beispiel).

So habe ich versucht, einige selbst zu codieren, überprüfen Sie dies zum Beispiel:

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

Ich habe eine Ereignisbehandlungsroutine für jedes Ereignis (Vorschau und Nichtvorschau) und ich wollte sehen, was passiert, welches Ereignis ausgelöst wird Ich habe ein Meldungsfeld für jedes Ereignis angezeigt).

Das Benutzersteuerelement "MyButton" erweitert einfach die Basisschaltfläche und überschreibt OnMouseDown und OnPreviewMouseDown, um das e.Handled auf "false" zu setzen:

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

(versucht mit diesem und ohne dieses).

Gemäß der MSDN-Übersicht (im obigen Link) sollte die Ereignisroute bei 3 Elementen wie folgt lauten:

PreviewMouseDown (Tunnel) für das Stammelement.

PreviewMouseDown (Tunnel) auf Zwischenelement # 1.

PreviewMouseDown (Tunnel) für Quellelement # 2.

MouseDown (Blase) auf Quellelement # 2.

MouseDown (Blase) auf Zwischenelement # 1.

MouseDown (Blase) auf dem Wurzelelement.

So erwartete ich das dasmessage boxes muss wie oben angegeben angezeigt werden. Aus irgendeinem Grund, von dem ich nicht verstehe, dass nur die Vorschauereignisse ausgelöst werden (entsprechend dem, was der MSDN sagt: Vorschau_B1 => Vorschau_B2 => Vorschau_B3). Meine Erwartungen waren: Preview_B1 => Preview_B2 => Preview_B3 => NonPreview_B3 => NonPreview_B2 => NonPreview_B1.

Aber die Nicht-Vorschau-Ereignisse werden überhaupt nicht ausgelöst.

So im Grunde verstehe ich die Route der Ereignisse nicht, aus der MSDN-Übersicht habe ich verstanden, dass die Route vom Stammelement ausgeht (Tunnel) zum Quellelement und dann wieder hoch (Blase) zum Stammelement, aber das ist in der Praxis nicht so.

s ist wirklich wichtig für mich, zu verstehen, wie diese Ereignisse funktionieren. Ich verstehe wahrscheinlich etwas Grundlegendes hier nicht, Ihre Hilfe wird geschätz

THANX !! -Gili

Antworten auf die Frage(8)

Ihre Antwort auf die Frage