Поскольку я предложил решение в указанном вопросе, я легко могу ответить на него.
Как я уже упоминал в комментариях, вам следует использовать перенаправленное событие MenuItem.SubMenuOpened
.
Итак, вот изменения, которые необходимо внести, чтобы этот код работал:
- Измените класс
WindowHelper
для обработки Menu
, а не MenuItem
s.Мы собираемся установить наше присоединенное свойство на Menu
, смотрите ваш 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