当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在WPF中添加自定义路由命令?》经验,为你挑选了3个好方法。

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



1> Guffa..:

我使用一个静态类,我放在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"

现在,我可以为命令创建绑定,就像应用程序命令一样:


    
    
    
    
    

并在菜单中使用绑定,例如:



真正的静态课程的重要性真的不容低估.令人沮丧的是,如果在非静态类中定义命令,WPF似乎会默默地忽略命令.
让_static_类来保存RoutedUICommands是我的关键.(如果它们在我的Window1类中,则XAML找不到它们.)谢谢!
为什么选择downvote?如果你不解释你认为错的是什么,它就无法改善答案.

2> Heinzi..:

您也可以直接在XAML中声明命令,而不是在静态类中定义它们.示例(改编自Guffas的好例子):


    
    


    
    

...



3> Waleed A.K...:

我知道我的答案为时已晚,但我希望它对未来有所帮助.

我喜欢Guffa和Heinzi的答案,但你只能使用一个命令来实现之前的结果.我通常使用"帮助"命令

 
        
  

我每次调用都使用CommandParametr,例如


    
    
    
    
    

要么


并在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类中的方法.

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有