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( );
                }));
            }
        }
Esempio n. 2
0
        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);
        }