【问题标题】:MenuItem event called multiple times多次调用 MenuItem 事件
【发布时间】:2015-03-24 13:55:23
【问题描述】:

我把 xml 读到课堂上:

public class MenuItem
{
  public string Header{get;set;}
  public List<MenuItem> ChildMenuItems{get;set;}
}

所以我明白了

  • 菜单 1
    • 菜单 1.1
    • 菜单 1.2
      • 菜单 1.2.1
      • 菜单 1.2.2
  • 菜单 2
    • 菜单 2.1
    • 菜单 2.2

然后在 MenuViewModel 中设置列​​表

 MenuItems = new ObservableCollection<MenuItem>(Service.GetMenu());

并在 UserControl 中为 caliburn Message.Attach 和 Action.TargetWithoutContext 设置属性

<Setter Property="cal:Message.Attach" Value="[Event Click] = [Action MenuClick($originalsourcecontext)]" />
<Setter Property="cal:Action.TargetWithoutContext" Value="{Binding Path=DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" />

方法“MenuClick”有时被调用的次数超出预期:

如果我单击菜单 1 -> MenuClick 执行 1 次
如果我单击 Menu 1.1 -> MenuClick 执行 2 次
如果我单击 Menu 1.2.1 -> MenuClick 执行 3 次

但我希望 Menu 1.1 和 Menu 1.2.1 事件只调用一次。
有什么想法吗?

【问题讨论】:

    标签: wpf c#-4.0 menu caliburn.micro


    【解决方案1】:

    不知道为什么会发生这种情况,但这可能与事件冒泡有关。

    当您单击顶部菜单项时,不会发送操作消息。只有在菜单关闭时才会触发操作消息。

    如果您想避免这种情况,您只需查看RoutedEventArgs 并检查OriginalSource 是否与ActionExecutionContext.Source 匹配。

    例如

    public void MenuClick(ActionExecutionContext context)
    {
        var routed = context.EventArgs as RoutedEventArgs;
    
        if(routed == null)
            throw new Exception("No routed event");
    
        if (routed.OriginalSource == context.Source)
        {
            MessageBox.Show(((MenuItem)context.Source).Header.ToString());
        }
    }
    

    免责声明:可能有更简单的方法来做到这一点

    更新:

    好的,将路由事件标记为已处理停止它冒泡,因此它与冒泡有关 - 我只需使用下面的代码来阻止事件在树上进一步传播

    public void MenuClick(ActionExecutionContext context)
    {
        var routed = context.EventArgs as RoutedEventArgs;
    
        if (routed != null)
            routed.Handled = true;
    
         MessageBox.Show(((MenuItem) context.Source).Header.ToString());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      相关资源
      最近更新 更多