Как добавить пользовательскую перенаправленную команду в WPF? - PullRequest
44 голосов
/ 02 марта 2009

У меня есть приложение, которое содержит меню и подменю. Я приложил команды аппликации к некоторым элементам подменю, таким как «Вырезать», «Копировать» и «Вставить».
У меня также есть некоторые другие пункты меню, которые не имеют команд приложения.
Как я могу добавить привязку команды к этим пунктам подменю?
Я просмотрел эту статью, но не смог прикрепить событие к моим элементам подменю.

Ответы [ 3 ]

91 голосов
/ 02 марта 2009

Я использую статический класс, который я помещаю после класса Window1 (или любого другого, называемого классом окна), где я создаю экземпляры класса RoutedUICommand:

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

}

Добавить пространство имен в разметку окна, используя пространство имен, в котором находится класс Window1:

xmlns:w="clr-namespace:NameSpaceOfTheApplication"

Теперь я могу создавать привязки для команд так же, как для команд приложения:

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

И используйте привязки в меню, например:

<MenuItem Name="Menu_DoSomething" Header="Do Something" Command="w:Command.DoSomething" />
63 голосов
/ 15 июня 2010

Вместо того, чтобы определять их в статическом классе, вы также можете объявить команды непосредственно в XAML. Пример (адаптированный из хорошего примера Guffas):

<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}" />
16 голосов
/ 31 августа 2011

Я знаю, что мой ответ слишком поздно , но я надеюсь, что это поможет для будущего .

Мне нравятся ответы Гуффы и Хайнци, но вы можете использовать только одну команду для достижения предыдущего результата. Я обычно использую команду справки

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

и я использую CommandParametr для каждого вызова, например

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

или

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

и в файле 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;
}

и если вы используете шаблон MVVM

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

и переместите переключатель на сайт ViewModule. и Action - это метод в том же классе ViewModule.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...