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.
Réponses
Trop de publicités?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" />
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}" />
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.