none
菜单项同时有事件和命令,执行完事件后自动执行命令,造成嵌套。 RRS feed

  • 问题

  • 我在WPF的MenuItem添加了Click事件和Command命令。二者共用CommandParameter提供的参数。命令是为了实现该菜单项的快捷键(参考http://stackoverflow.com/questions/4682915/defining-menuitem-shortcuts网页的ruffin提供实例实现),即按快捷键后,根据参数转去执行该菜单项的事件处理体。
    问题是,点击菜单项,执行事件后,系统自动又去执行命令。如上所述,命令实际又去执行事件处理体。造成事件处理体代码被重复执行,形成嵌套重复。不过,如果按快捷键,通过命令执行,倒是正确的。
    我尝试通过在事件处理体最后加e.handled=true;,以及在自定义的命令CanExcute方法中增加判断等办法阻断事件的嵌套执行,都没有成功。
    请教各位老师帮助提供解决方法,或有关思路,或有关线索。谢谢了。

    ly_he

    2017年5月13日 12:44

答案

  • Hi ly_he,

    感谢你分享你的解决方案,如果你的问题已经解决,我们希望你可以标记你的回复为答案,这将有助于其他人快速搜到这个帖子,如果他们也正在遇到类似的问题。

    感谢你对论坛做的贡献。

    Best Regards,

    Bob


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 ly_he 2017年5月25日 15:30
    2017年5月18日 6:32
    版主

全部回复

  • 劳驾各位了,上述问题我已解决。现将方法说明如下:

    一、在该菜单项注册的Click事件处理体结尾加一个修改CommandParater值的语句,如:

            public void theMenuItem_Click(object sender, RoutedEventArgs e)
            {
                MenuItem item = (MenuItem)sender;
                switch (item.CommandParameter.ToString())
                {
                     // 根据参数不同值执行各自逻辑

                }

                // 关键:修改参数的值,比如:
                item.CommandParameter="EventHasDone";
            }

    二、在自定义命令类,为CanExecute方法增加一个判断,如:

            public bool CanExecute(object parameter)
            {
                if ((string)parameter == "EventHasDone")
                    return false;    // 既然事情已经被事件处理体干了,命令这边就不需要重复劳动了。
                return true;
            }

    三、说明。

        其实,不为CanExecute增加那个判断,作用也一样(在命令处理体,由于参数改变,自然无法按预定的参数执行各自逻辑)。这样做,一是比较正式;另外,可能效率也高点吧。

    请指教。

       


    ly_he

    2017年5月14日 5:24
  • Hi ly_he,

    感谢你分享你的解决方案,如果你的问题已经解决,我们希望你可以标记你的回复为答案,这将有助于其他人快速搜到这个帖子,如果他们也正在遇到类似的问题。

    感谢你对论坛做的贡献。

    Best Regards,

    Bob


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 ly_he 2017年5月25日 15:30
    2017年5月18日 6:32
    版主