因为我在参考问题中提出了解决方案,所以我可以很容易地回答这个问题。
正如我在评论中提到的,你应该使用
MenuItem.SubMenuOpened
路由事件。
因此,为了使此代码正常工作,需要进行以下修改:
-
更改
WindowHelper
类来处理
Menu
,而不是
MenuItem
我们要把我们的附属财产
菜单
,看看你的xaml!
private class WindowHelper
{
// Third parameter is a Menu, not a MenuItem
public static void Enable(HwndSource hwndSource, Window window, Menu menu)
{
WindowHelper helper = new WindowHelper(hwndSource, window);
hwndSource.AddHook(helper.WndProc);
// Subscribe to the routed event MenuItem.SubmenuClosed
menu.AddHandler(MenuItem.SubmenuClosedEvent, (RoutedEventHandler)helper.Menu_Closed);
}
// The method signature has to be changed - this is a routed event handler now
private void Menu_Closed(object sender, RoutedEventArgs e)
{
Menu menu = (Menu)sender;
MenuItem menuItem = (MenuItem)e.Source;
if (menuItem.Parent != menu)
{
// If it's not the first level menu, ignore it.
// We only disable our helper when the whole menu closes.
return;
}
// Unsubscribe from the routed event
menu.RemoveHandler(MenuItem.SubmenuClosedEvent, (RoutedEventHandler)Menu_Closed);
mHwndSource.RemoveHook(WndProc);
}
// Rest is unchanged
// ...
}
-
更改
Menu_Opened
事件处理程序签名以对应
RoutedEventHandler
代表。更新事件订阅代码。
private static void Menu_Opened(object sender, RoutedEventArgs e)
{
Menu menu = (Menu)sender;
MenuItem menuItem = (MenuItem)e.Source;
if (menuItem.Parent != menu)
{
// We don't want to process any sub-menus in the deeper levels,
// because the helper will already be enabled when
// a first level menu opens
return;
}
Window w = Window.GetWindow(menu);
if (w != null)
{
HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(w).Handle);
if (source != null)
{
WindowHelper.Enable(source, w, menu);
}
}
}
-
最后,更新初始事件订阅代码-我们现在有路由事件!
private static void EnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Menu menu = (Menu)d;
if ((bool)e.NewValue)
{
menu.AddHandler(MenuItem.SubmenuOpenedEvent, (RoutedEventHandler)Menu_Opened);
}
else
{
menu.RemoveHandler(MenuItem.SubmenuOpenedEvent, (RoutedEventHandler)Menu_Opened);
}
}
现在这个可以用来做菜单了。
顺便说一下,而不是
w.WindowState.ToString() == "Maximized"
你应该使用
w.WindowState == WindowState.Maximized