51 votes

Comment ajouter une commande personnalisée routée dans WPF?

J'ai une application qui contient Menu et sous-menus. J'ai joint des commandes d'application à certains éléments de sous-menu tels que Couper, Copier et Coller.
J'ai aussi quelques autres éléments de menu qui n'ont pas de commandes d'application.
Comment pourrais-je ajouter une commande personnalisée liant ces éléments de sous-menu?
J'ai lu cet article, mais je n'ai pas pu attacher d'événement à mes éléments de sous-menu.

100voto

Guffa Points 308133

J'utilise une classe statique que je place après la Window1 classe (ou quelle que soit la classe de la fenêtre se trouve être nommé), où j'ai créer des instances de la RoutedUICommand classe:

public static class Command {

    public static readonly RoutedUICommand DoSomething = new RoutedUICommand("Do something", "DoSomething", typeof(Window1));
    public static readonly RoutedUICommand SomeOtherAction = new RoutedUICommand("Some other action", "SomeOtherAction", typeof(Window1));
    public static readonly RoutedUICommand MoreDeeds = new RoutedUICommand("More deeds", "MoreDeeeds", typeof(Window1));

}

Ajouter un espace de noms dans la fenêtre balisage, à l'aide de l'espace de noms que l'Window1 classe:

xmlns:w="clr-namespace:NameSpaceOfTheApplication"

Maintenant, je peux créer des liaisons pour les commandes que pour les commandes d'application:

<Window.CommandBindings>
    <CommandBinding Command="ApplicationCommands.Open" Executed="CommandBinding_Open" />
    <CommandBinding Command="ApplicationCommands.Paste" Executed="CommandBinding_Paste" />
    <CommandBinding Command="w:Command.DoSomething" Executed="CommandBinding_DoSomething" />
    <CommandBinding Command="w:Command.SomeOtherAction" Executed="CommandBinding_SomeOtherAction" />
    <CommandBinding Command="w:Command.MoreDeeds" Executed="CommandBinding_MoreDeeds" />
</Window.CommandBindings>

Et utiliser les liaisons dans un menu, par exemple:

<MenuItem Name="Menu_DoSomething" Header="Do Something" Command="w:Command.DoSomething" />

73voto

Heinzi Points 66519

Au lieu de les définir dans une classe statique, vous pouvez également déclarer les commandes directement en XAML. Exemple (adapté de Guffas bel exemple):

 <Window.Resources>
    <RoutedUICommand x:Key="DoSomethingCommand" Text="Do Something" />
    <RoutedUICommand x:Key="DoSomethingElseCommand" Text="Do Something Else" />
</Window.Resources>
<Window.CommandBindings>
    <CommandBinding Command="{StaticResource DoSomethingCommand}" Executed="CommandBinding_DoSomething" />
    <CommandBinding Command="{StaticResource DoSomethingElseCommand}" Executed="CommandBinding_DoSomethingElse" />
</Window.CommandBindings>
...
<MenuItem Name="Menu_DoSomething" Header="Do Something" Command="{StaticResource DoSomethingCommand}" />
 

20voto

Waleed A.K. Points 426

Je Sais que ma réponse est trop tard, mais j'espère que ça aidera pour l' avenir.

J'Aime Guffa et Heinzi réponses, mais vous pouvez utiliser une seule commande pour obtenir le résultat précédent. J'ai l'habitude d'utiliser la commande Help

 <Window.CommandBindings>
        <CommandBinding Command="Help" Executed="HelpExecuted" />
  </Window.CommandBindings>

et j'utilise CommandParametr à chaque appel.e.g

<Window.InputBindings>
    <KeyBinding Command="Help" Key="A" Modifiers="Ctrl" CommandParameter="Case1"/>
    <KeyBinding Command="Help" Key="B" Modifiers="Ctrl" CommandParameter="Case2"/>
    <KeyBinding Command="Help" Key="C" Modifiers="Ctrl" CommandParameter="Case3"/>
    <KeyBinding Command="Help" Key="D" Modifiers="Ctrl" CommandParameter="Case4"/>
    <MouseBinding Command="Help" MouseAction="LeftDoubleClick" CommandParameter="Case5" />
</Window.InputBindings>

ou

<Button Command="Help" CommandParameter="Case6" Content="Button">
    <Button.InputBindings>
        <KeyBinding Command="Help" Gesture="Ctrl+D" CommandParameter="Case7"/>
    </Button.InputBindings>
</Button>

et dans le fichier cs

private void HelpExecuted(object sender, ExecutedRoutedEventArgs e)
{
    string str = e.Parameter as string;
    switch (str)
    {
        case null://F1 Pressed default Help
               //Code
            break;
        case "Case1":
               //Code
            break;
        case "Case2":
               //Code
            break;
        case "Case3":
               //Code
            break;
        case "Case4":
            break;
        case "Case5":
               //Code
            break;
        case "Case6":
               //Code
            break;
        case "Case7":
               //Code
            break;
    }
    e.Handled = true;
}

et si vous utilisez le pattern MVVM

private void HelpExecuted(object sender, ExecutedRoutedEventArgs e)
{
    string str = e.Parameter as string;
    Mvvm_Variable.Action(Input: str);
    e.Handled = true;
}

et déplacer le commutateur vers ViewModule site. et l'Action est une méthode de la même ViewModule classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X