C# 如何在WPF中添加自定义路由命令?

C# 如何在WPF中添加自定义路由命令?,c#,wpf,C#,Wpf,我有一个包含菜单和子菜单的应用程序。我已将应用程序定位命令附加到一些子菜单项,如剪切、复制和粘贴我还有一些没有应用程序命令的其他菜单项如何向这些子菜单项添加自定义命令绑定我已经阅读了文章,但无法将事件附加到我的子菜单项 我使用一个静态类,我将它放在Window1类(或window类碰巧命名的任何类)之后,在这里我创建RouteDuicCommand类的实例: public static class Command { public static readonly RoutedUICom

我有一个包含菜单和子菜单的应用程序。我已将应用程序定位命令附加到一些子菜单项,如剪切、复制和粘贴
我还有一些没有应用程序命令的其他菜单项
如何向这些子菜单项添加自定义命令绑定
我已经阅读了文章,但无法将事件附加到我的子菜单项

我使用一个静态类,我将它放在Window1类(或window类碰巧命名的任何类)之后,在这里我创建RouteDuicCommand类的实例:

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

与其在静态类中定义命令,不如直接在XAML中声明命令。示例(改编自Guffas尼斯示例):


...

我知道我的答案太晚了,但我希望它对未来有所帮助

我喜欢Guffa和Heinzi的答案,但您只能使用一个命令来实现前面的结果。 我通常使用Help命令

 <Window.CommandBindings>
        <CommandBinding Command="{StaticResource Help}" Executed="HelpExecuted" />
  </Window.CommandBindings>
如果您使用的是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类中的一个方法

对我来说,让静态类保存RoutedUICommands是关键。(如果它们在我的Window1类中,XAML找不到它们。)谢谢!这个类是静态的,其重要性是不可低估的。令人沮丧的是,如果命令是在非静态类中定义的,WPF似乎会默默地忽略这些命令。为什么要投否决票?如果你不解释你认为错误的地方,就无法改进答案。仅供参考-不要犯我犯过的新手错误:静态属性(例如
命令.DoSomething
)必须是公共的,否则你将收到以下异常“CommandConverter无法从System.String转换”。我假设这是因为管理命令的代码可能位于不同的程序集中,因此无法看到
internal
属性。我上周才开始学习WPF:DI在谷歌上搜索了不少,直到我找到了这个关于如何做事的简洁而漂亮的解释。非常感谢。就是那张票!使用命令的Properties值为我打开了许多新的可能性:-)我刚刚使用了ApplicationCommands.notaccommand,其属性用于MinimizeWindow、MaximizeWindow和restoredownwindow我喜欢这样(任何可以减少锅炉板的东西!),但值得注意的是,它确实有一个限制-包含在,例如,菜单项是按命令定义的,因此如果您需要(或以后可能添加)菜单,此方法可能不是最好的(我通常也会将按钮标签绑定到命令文本)。@Bob,这是一个简单的开关语句,限制是按表单,您将使用所有快捷方式组合,以反映命令参数字符串。在这种情况下,即使是路由命令也帮不了你。对不起@Waleed,我没有跟上你。也许我不清楚。Guffa和Heinzi在回答时都使用了
RoutedUICommand
。这个类有一个
Text
属性,从中获取文本以自动填充调用该命令的菜单项(并且可以在其他地方使用-我经常通过共享模板将按钮文本绑定到它)。如果使用一个命令(比如“Help”),所有菜单项都将具有在
Help.text
中定义的同一条文本。根据您喜欢的体系结构,这可能不是一个大问题,但我认为这是一个需要注意的问题。抱歉@Bob我想了解您,感谢您的解释这些是否与实际的C代码绑定?如果是,怎么做?常规命令的作用是什么?他们增加了什么功能?@EdJ.Plunkett:1。对2.通过命令绑定:
CommandBinding_DoSomething
CommandBinding_DoSomethingElse
是C代码。3./4. 有关RoutedCommands与常规按钮单击绑定的优势的一般性讨论,请参见(例如,“谁在乎?”)部分。谢谢。我想知道常规命令相对于Guffa的例子增加了什么,而不是相对于常规的或老式的onclick处理(如果我理解你的话——如果我必须这样做,我就不会问所有这些!),但我会在Josh Smith的文章中查找。@EdJ.Plunkett:啊,好的。Guffa也使用RoutedUICommands,他只是在静态类中声明它们,而不是在XAML中声明它们。这是他的例子和我的唯一不同之处。你想把它们放在哪里是一个选择的问题。我最喜欢这个答案。更干净。找到这个youtube链接。
<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>
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;
}
private void HelpExecuted(object sender, ExecutedRoutedEventArgs e)
{
    string str = e.Parameter as string;
    Mvvm_Variable.Action(Input: str);
    e.Handled = true;
}