C# 菜单项打开和关闭事件

C# 菜单项打开和关闭事件,c#,wpf,event-handling,wpf-controls,menuitem,C#,Wpf,Event Handling,Wpf Controls,Menuitem,每当菜单项的子菜单打开时,我想处理一个事件。结束时也一样。我怎样才能做到这一点呢?不确定您想要什么,但请查看ContextMenu和MenuItem的这些事件: 上下文菜单: MenuItem: 我认为ContextMenuOpening和ContextMenuClosing可能会很有趣;) 非常简单。订阅菜单项的子菜单打开事件。传统做法: MidItem.SubmenuOpened += new RoutedEventHandler(MidItem_SubmenuOpened); pri

每当菜单项的子菜单打开时,我想处理一个事件。结束时也一样。我怎样才能做到这一点呢?

不确定您想要什么,但请查看
ContextMenu
MenuItem
的这些事件:

上下文菜单

MenuItem


我认为
ContextMenuOpening
ContextMenuClosing
可能会很有趣;)

非常简单。订阅
菜单项
子菜单打开
事件。传统做法:

MidItem.SubmenuOpened += new RoutedEventHandler(MidItem_SubmenuOpened);

private void MidItem_SubmenuOpened(object sender, RoutedEventArgs e)
{
    //Menu Open Logic Here
}
或者采用冷静的动态方法:

MidItem.SubmenuOpened += delegate(object sender, RoutedEventArgs e)
{
    //Menu Open Logic Here
};

如果希望在实际打开之前打开,可以将menuitem子类化

Imports System.ComponentModel
Public Class CustomMenuItem
    Inherits MenuItem

    Public Event SubMenuOpening(sender As Object, e As CancelEventArgs)
    Public Event SubMenuClosing(sender As Object, e As CancelEventArgs)
    Protected Overrides Sub OnPropertyChanged(e As DependencyPropertyChangedEventArgs)
        If e.Property Is MenuItem.IsSubmenuOpenProperty Then
            Dim MyCancelEventArgs As New CancelEventArgs
            If e.NewValue Then
                RaiseEvent SubMenuOpening(Me, MyCancelEventArgs)
                If MyCancelEventArgs.Cancel Then Me.IsSubmenuOpen = False
            Else
                RaiseEvent SubMenuClosing(Me, MyCancelEventArgs)
                If MyCancelEventArgs.Cancel Then Me.IsSubmenuOpen = True
            End If
        End If
        MyBase.OnPropertyChanged(e)
    End Sub

End Class
我知道这是VB,但它很容易转换。
另外,使用CancelEventArgs,您可以模拟取消打开(或关闭)。

问题是,它们仅在菜单/上下文菜单实际打开时才会触发。在某些情况下,您可能还希望检查它应该在何时打开(例如,当上一个菜单打开时,主菜单悬停在其上方),而这些事件不会捕获该事件。不幸的是,我认为除了完全重写控件行为之外,没有办法处理这些事件