Frage

Mein Problem ist, dass ich einen Befehl an mehreren Stellen zu handhaben möchte. Zum Beispiel habe ich meine benutzerdefinierte Usercontrol, wo ein Knopf bis zu einem gewissen Befehl gebunden ist. Ich habe einen Befehl in dieser Kontrollbindung, aber ich habe auch einen Befehl in einem Fenster binden, die diese Steuerung verwendet wird.

Mein Ziel ist es, eine Aktion in der Steuerung durchzuführen, während nicht im Fenster Handhabung des Befehls unterbrochen wird.

habe ich versucht, mit Ausgeführt und PreviewExecuted Ereignissen zu experimentieren, aber ohne Glück. Dann simulierte ich das Problem in einem einzigen Fenster (Code geschrieben unten).

<Window x:Class="CommandingEvents.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:CommandingEvents="clr-namespace:CommandingEvents" 
    Title="Window1" Height="300" Width="300">
<Window.CommandBindings>
    <CommandBinding 
        Command="{x:Static CommandingEvents:Window1.Connect}"
        Executed="CommandBindingWindow_Executed"
        PreviewExecuted="CommandBindingWindow_PreviewExecuted"/>
</Window.CommandBindings>
<Grid>
    <Grid.CommandBindings>
        <CommandBinding 
        Command="{x:Static CommandingEvents:Window1.Connect}"
        Executed="CommandBindingGrid_Executed"
        PreviewExecuted="CommandBindingGrid_PreviewExecuted" />
    </Grid.CommandBindings>
    <Button Command="{x:Static CommandingEvents:Window1.Connect}" 
            CommandTarget="{Binding RelativeSource={RelativeSource Self}}"
            Content="Test" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>

namespace CommandingEvents
{
    public partial class Window1
    {
        public static readonly RoutedUICommand Connect = new
            RoutedUICommand("Connect", "Connect", typeof(Window1));

        public Window1()
        {
            InitializeComponent();
        }

        private void CommandBindingWindow_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            Console.WriteLine("CommandBindingWindow_Executed");
            e.Handled = false;
        }

        private void CommandBindingGrid_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            Console.WriteLine("CommandBindingGrid_Executed");
            e.Handled = false;
        }

        private void CommandBindingWindow_PreviewExecuted(object sender, ExecutedRoutedEventArgs e)
        {
            Console.WriteLine("CommandBindingWindow_PreviewExecuted");
            e.Handled = false;
        }

        private void CommandBindingGrid_PreviewExecuted(object sender, ExecutedRoutedEventArgs e)
        {
            Console.WriteLine("CommandBindingGrid_PreviewExecuted");
            e.Handled = false;
        }
    }
}

Wenn ich den Knopf drücken nur „CommandBindingWindow_PreviewExecuted“ ausgedruckt. Warum ist das so? Ich habe versucht, auf false setzen e.Handled aber es macht keinen Unterschied machen. Kann jemand dieses Verhalten erklären?

War es hilfreich?

Lösung

Ich habe keine Ahnung, warum das passiert (und wie es ist kein Fehler), aber hier ist das, was in der WPF Wiki :

Es gibt eine Besonderheit über Command was extrem ist interessant und wichtig zu wissen.

Der Befehlsmanager verwendet Routingereignisse die verschiedenen Command benachrichtigen Objekte, die eine Befehlsausführung war aufgerufen (durch Standard Gestik, Eingabebindungen, explizit, usw.).

Bis jetzt ist dies ziemlich einfach. Doch was ist mehr wichtig ist, dass Command Wille markieren Sie das Routingereignis aus der Befehlsmanager wie sobald ein behandelt Handler wird (entweder ausgeführt PreviewExecuted oder Ausgeführt).

Schließlich, auch wenn Ihr Handler hat eine Prototyp, der einen Delegaten Spiele genannt ExecutedRoutedEventHandler, die Ausgeführt Ereignis aus der Command kein RoutedEvent ist aber ein normaler CLR Veranstaltung. Einstellen oder der Abgang e.Handled Flag auf false wird sich ändern nichts.

Deshalb, sobald ein Ausgeführt oder PreviewExecuted Handler aufgerufen wird, die RoutedCommand wird halt sein Routing.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top