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); } } } }
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); }
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; }