Exemplo n.º 1
0
        private void MenuFlyout_Opened(object sender, object e)
        {
            if (_parentMenu.UpdateMenuItemsFlyoutPlacement() && !_menuFlyoutPlacementChanged)
            {
                _menuFlyoutPlacementChanged = true;
                ShowMenu();
            }

            _parentMenu.CalculateBounds();
            IsOpened = true;
            VisualStateManager.GoToState(this, "Opened", true);
            _parentMenu.IsInTransitionState = false;

            if (!_menuFlyoutRepositioned)
            {
                var popup = VisualTreeHelper.GetOpenPopups(Window.Current).FirstOrDefault(p => p.Child is MenuFlyoutPresenter);

                if (popup != null)
                {
                    var mfp    = (MenuFlyoutPresenter)popup.Child;
                    var height = mfp.ActualHeight;
                    var width  = mfp.ActualWidth;

                    var flytoutButtonPoint = FlyoutButton.TransformToVisual(Window.Current.Content).TransformPoint(new Point(0, 0));

                    if ((width > Window.Current.Bounds.Width - flytoutButtonPoint.X &&
                         (MenuFlyout.Placement == FlyoutPlacementMode.Bottom)) ||
                        (height > Window.Current.Bounds.Height - flytoutButtonPoint.Y &&
                         (MenuFlyout.Placement == FlyoutPlacementMode.Right)))
                    {
                        ShowMenuRepositioned(width, height);
                    }
                }
            }
        }
        private void MenuFlyout_Opened(object sender, object e)
        {
            if (_parentMenu.UpdateMenuItemsFlyoutPlacement() && !_menuFlyoutPlacementChanged)
            {
                _menuFlyoutPlacementChanged = true;
                ShowMenu();
            }

            _parentMenu.CalculateBounds();
            IsOpened = true;
            VisualStateManager.GoToState(this, "Opened", true);
            _parentMenu.IsInTransitionState = false;

            if (!_menuFlyoutRepositioned)
            {
                IReadOnlyList <Popup> popups;
                UIElement             content;
                double outerContentWidth;
                double outerContentHeight;
#if !HAS_UNO
                if (ControlHelpers.IsXamlRootAvailable && MenuFlyout.XamlRoot != null)
                {
                    popups             = VisualTreeHelper.GetOpenPopupsForXamlRoot(MenuFlyout.XamlRoot);
                    content            = MenuFlyout.XamlRoot.Content;
                    outerContentWidth  = MenuFlyout.XamlRoot.Size.Width;
                    outerContentHeight = MenuFlyout.XamlRoot.Size.Height;
                }
                else
#endif
                {
                    popups             = VisualTreeHelper.GetOpenPopups(Windows.UI.Xaml.Window.Current);
                    content            = Windows.UI.Xaml.Window.Current.Content;
                    outerContentWidth  = Windows.UI.Xaml.Window.Current.Bounds.Width;
                    outerContentHeight = Windows.UI.Xaml.Window.Current.Bounds.Height;
                }

                var popup = popups.FirstOrDefault(p => p.Child is MenuFlyoutPresenter);

                if (popup != null)
                {
                    var mfp    = (MenuFlyoutPresenter)popup.Child;
                    var height = mfp.ActualHeight;
                    var width  = mfp.ActualWidth;

                    var flytoutButtonPoint = FlyoutButton.TransformToVisual(content).TransformPoint(new Point(0, 0));

                    if ((width > outerContentWidth - flytoutButtonPoint.X &&
                         (MenuFlyout.Placement == FlyoutPlacementMode.Bottom)) ||
                        (height > outerContentHeight - flytoutButtonPoint.Y &&
                         (MenuFlyout.Placement == FlyoutPlacementMode.Right)))
                    {
                        ShowMenuRepositioned(width, height);
                    }
                }
            }
        }
Exemplo n.º 3
0
        private static bool NavigateUsingKeyboard(KeyEventArgs args, Menu menu, Orientation orientation)
        {
            object element;

            if (ControlHelpers.IsXamlRootAvailable && menu.XamlRoot != null)
            {
                element = FocusManager.GetFocusedElement(menu.XamlRoot);
            }
            else
            {
                element = FocusManager.GetFocusedElement();
            }

            if (element is MenuFlyoutPresenter &&
                ((args.VirtualKey == VirtualKey.Down) ||
                 (args.VirtualKey == VirtualKey.Up) ||
                 (args.VirtualKey == VirtualKey.Left) ||
                 (args.VirtualKey == VirtualKey.Right)))
            {
                // Hack to delay and let next element get focus
                FocusManager.FindNextFocusableElement(FocusNavigationDirection.Right);
                return(true);
            }

            if (!menu.IsOpened && element is MenuItem)
            {
                menu.UpdateMenuItemsFlyoutPlacement();

                if (args.VirtualKey == VirtualKey.Enter ||
                    ((args.VirtualKey == VirtualKey.Down) && menu.CurrentFlyoutPlacement == FlyoutPlacementMode.Bottom) ||
                    ((args.VirtualKey == VirtualKey.Up) && menu.CurrentFlyoutPlacement == FlyoutPlacementMode.Top) ||
                    ((args.VirtualKey == VirtualKey.Left) && menu.CurrentFlyoutPlacement == FlyoutPlacementMode.Left) ||
                    ((args.VirtualKey == VirtualKey.Right) && menu.CurrentFlyoutPlacement == FlyoutPlacementMode.Right))
                {
                    menu.SelectedMenuItem.ShowMenu();
                    return(true);
                }

                if ((args.VirtualKey == VirtualKey.Left && orientation == Orientation.Horizontal) ||
                    (args.VirtualKey == VirtualKey.Up && orientation == Orientation.Vertical))
                {
                    GetNextMenuItem(menu, -1);
                    return(true);
                }

                if ((args.VirtualKey == VirtualKey.Right && orientation == Orientation.Horizontal) ||
                    (args.VirtualKey == VirtualKey.Down && orientation == Orientation.Vertical))
                {
                    GetNextMenuItem(menu, +1);
                    return(true);
                }
            }

            if ((menu.CurrentFlyoutPlacement == FlyoutPlacementMode.Left &&
                 args.VirtualKey == VirtualKey.Right) ||
                (args.VirtualKey == VirtualKey.Left &&
                 menu.CurrentFlyoutPlacement != FlyoutPlacementMode.Left))
            {
                if (element is MenuFlyoutItem)
                {
                    menu.IsInTransitionState = true;
                    menu.SelectedMenuItem.HideMenu();
                    GetNextMenuItem(menu, -1).ShowMenu();
                    return(true);
                }

                if (element is MenuFlyoutSubItem menuFlyoutSubItem)
                {
                    if (menuFlyoutSubItem.Parent is MenuItem && element == menu._lastFocusElement)
                    {
                        menu.IsInTransitionState = true;
                        menu.SelectedMenuItem.HideMenu();
                        GetNextMenuItem(menu, -1).ShowMenu();
                        return(true);
                    }
                }
            }

            if ((args.VirtualKey == VirtualKey.Right &&
                 menu.CurrentFlyoutPlacement != FlyoutPlacementMode.Left) ||
                (args.VirtualKey == VirtualKey.Left &&
                 menu.CurrentFlyoutPlacement == FlyoutPlacementMode.Left))
            {
                if (element is MenuFlyoutItem)
                {
                    menu.IsInTransitionState = true;
                    menu.SelectedMenuItem.HideMenu();
                    GetNextMenuItem(menu, +1).ShowMenu();
                    return(true);
                }
            }

            return(false);
        }
Exemplo n.º 4
0
        private static bool NavigateUsingKeyboard(object element, KeyEventArgs args, Menu menu, Orientation orientation)
        {
            if (!menu.IsOpened && element is MenuItem)
            {
                menu.UpdateMenuItemsFlyoutPlacement();

                if (args.VirtualKey == VirtualKey.Enter ||
                    ((args.VirtualKey == VirtualKey.Down) && menu._currentFlyoutPlacement == FlyoutPlacementMode.Bottom) ||
                    ((args.VirtualKey == VirtualKey.Up) && menu._currentFlyoutPlacement == FlyoutPlacementMode.Top) ||
                    ((args.VirtualKey == VirtualKey.Left) && menu._currentFlyoutPlacement == FlyoutPlacementMode.Left) ||
                    ((args.VirtualKey == VirtualKey.Right) && menu._currentFlyoutPlacement == FlyoutPlacementMode.Right))
                {
                    menu.SelectedMenuItem.ShowMenu();
                    return true;
                }

                if ((args.VirtualKey == VirtualKey.Left && orientation == Orientation.Horizontal) ||
                    (args.VirtualKey == VirtualKey.Up && orientation == Orientation.Vertical))
                {
                    GetNextMenuItem(menu, -1);
                    return true;
                }

                if ((args.VirtualKey == VirtualKey.Right && orientation == Orientation.Horizontal) ||
                    (args.VirtualKey == VirtualKey.Down && orientation == Orientation.Vertical))
                {
                    GetNextMenuItem(menu, +1);
                    return true;
                }
            }

            if ((menu._currentFlyoutPlacement == FlyoutPlacementMode.Left &&
                 args.VirtualKey == VirtualKey.Right) ||
                 (args.VirtualKey == VirtualKey.Left &&
                 menu._currentFlyoutPlacement != FlyoutPlacementMode.Left))
            {
                if (element is MenuFlyoutItem)
                {
                    menu.IsInTransitionState = true;
                    menu.SelectedMenuItem.HideMenu();
                    GetNextMenuItem(menu, -1).ShowMenu();
                    return true;
                }

                if (element is MenuFlyoutSubItem)
                {
                    var menuFlyoutSubItem = (MenuFlyoutSubItem)element;
                    if (menuFlyoutSubItem.Parent is MenuItem && element == menu._lastFocusElement)
                    {
                        menu.IsInTransitionState = true;
                        menu.SelectedMenuItem.HideMenu();
                        GetNextMenuItem(menu, -1).ShowMenu();
                        return true;
                    }
                }
            }

            if ((args.VirtualKey == VirtualKey.Right &&
                menu._currentFlyoutPlacement != FlyoutPlacementMode.Left) ||
                (args.VirtualKey == VirtualKey.Left &&
                menu._currentFlyoutPlacement == FlyoutPlacementMode.Left))
            {
                if (element is MenuFlyoutItem)
                {
                    menu.IsInTransitionState = true;
                    menu.SelectedMenuItem.HideMenu();
                    GetNextMenuItem(menu, +1).ShowMenu();
                    return true;
                }
            }

            return false;
        }