protected override void OnParentChanged( ) { if (Parent != null) { assert(Parent is WindowsHost); // Вешаем на WindowsHost обработчик события MenuItem.ClickEvent, // чтобы ловить момент выбора пункта меню в одном из модальных всплывающих окошек // Дело в том, что эти окошки не являются дочерними элементами контрола Menu, // а напрямую являются дочерними элементами WindowsHost (т.к. именно он создаёт // окна). И событие выбора пункта меню из всплывающего окошка может быть поймано // в WindowsHost, но не в Menu. А нам нужно повесить обработчик, который закроет // все показанные попапы. EventManager.AddHandler(Parent, MenuItem.ClickEvent, new RoutedEventHandler((sender, args) => CloseAllSubmenus( )), true); EventManager.AddHandler(Parent, MenuItem.Popup.ControlKeyPressedEvent, new KeyEventHandler((sender, args) => { CloseAllSubmenus( ); // ConsoleApplication.Instance.FocusManager.SetFocusScope(this); if (args.wVirtualKeyCode == VirtualKeys.Right) { ConsoleApplication.Instance.FocusManager.MoveFocusNext( ); } else if (args.wVirtualKeyCode == VirtualKeys.Left) { ConsoleApplication.Instance.FocusManager.MoveFocusPrev(); } MenuItem focusedItem = (MenuItem)this.Items.SingleOrDefault( item => item is MenuItem && item.HasFocus); focusedItem.Expand( ); })); } }
public void OpenMenu(WindowsHost windowsHost, Point point) { if (expanded) { return; } // Вешаем на WindowsHost обработчик события MenuItem.ClickEvent, // чтобы ловить момент выбора пункта меню в одном из модальных всплывающих окошек // Дело в том, что эти окошки не являются дочерними элементами контрола Menu, // а напрямую являются дочерними элементами WindowsHost (т.к. именно он создаёт // окна). И событие выбора пункта меню из всплывающего окошка может быть поймано // в WindowsHost, но не в Menu. А нам нужно повесить обработчик, который закроет // все показанные попапы. EventManager.AddHandler(windowsHost, MenuItem.ClickEvent, windowsHostClick = (sender, args) => { CloseAllSubmenus( ); popup.Close( ); }, true); EventManager.AddHandler(windowsHost, MenuItem.Popup.ControlKeyPressedEvent, windowsHostControlKeyPressed = (sender, args) => { CloseAllSubmenus( ); // //ConsoleApplication.Instance.FocusManager.SetFocusScope(this); if (args.wVirtualKeyCode == VirtualKeys.Right) { ConsoleApplication.Instance.FocusManager.MoveFocusNext( ); } else if (args.wVirtualKeyCode == VirtualKeys.Left) { ConsoleApplication.Instance.FocusManager.MoveFocusPrev( ); } MenuItem focusedItem = ( MenuItem )this.Items.SingleOrDefault( item => item is MenuItem && item.HasFocus); focusedItem.Expand( ); }); if (null == popup) { popup = new MenuItem.Popup(this.Items, this.popupShadow, 0); popup.AddHandler(Window.ClosedEvent, new EventHandler(onPopupClosed)); } popup.X = point.X; popup.Y = point.Y; windowsHost.ShowModal(popup, true); expanded = true; this.windowsHost = windowsHost; }
public bool TryMatchGesture(KeyEventArgs args) { Dictionary <KeyGesture, MenuItem> map = getGesturesMap( ); KeyGesture match = map.Keys.FirstOrDefault(gesture => gesture.Matches(args)); if (match == null) { return(false); } this.CloseAllSubmenus( ); // Activate matches menu item MenuItem menuItem = map[match]; List <MenuItem> path = new List <MenuItem>(); MenuItem currentItem = menuItem; while (currentItem != null) { path.Add(currentItem); currentItem = currentItem.ParentItem; } path.Reverse( ); // Open all menu items in path successively int i = 0; Action action = null; action = new Action(() => { if (i < path.Count) { MenuItem item = path[i]; if (item.Type == MenuItemType.Item) { item.RaiseClick( ); return; } // Activate focus on item if (item.ParentItem == null) { ConsoleApplication.Instance.FocusManager.SetFocus(this, item); } else { // Set focus to PopupWindow -> item ConsoleApplication.Instance.FocusManager.SetFocus( item.Parent.Parent, item); } item.Invalidate(); EventHandler handler = null; // Wait for layout to be revalidated and expand it handler = (o, eventArgs) => { item.Expand(); item.LayoutRevalidated -= handler; i++; if (i < path.Count) { action(); } }; item.LayoutRevalidated += handler; } }); action(); return(true); }