コード例 #1
0
 protected override void OnPreviewKeyDown(KeyEventArgs e)
 {
     if (e.Handled)
     {
         return;
     }
     if (e.Key == Key.Down)
     {
         DependencyObject element = e.OriginalSource as DependencyObject;
         if (element != null)
         {
             UIElement footerPaneHost = FooterPaneHost;
             if (footerPaneHost != null &&
                 footerPaneHost.IsKeyboardFocusWithin &&
                 TreeHelper.IsVisualAncestorOf(footerPaneHost, element))
             {
                 DependencyObject nextFocus = RibbonHelper.PredictFocus(element, FocusNavigationDirection.Down);
                 if (nextFocus == null ||
                     nextFocus == element)
                 {
                     // If the focus is on the last element of footer pane,
                     // then try moving focus into items pane and then into
                     // auxiliary pane if needed.
                     if (ItemsPaneMoveFocus(FocusNavigationDirection.First) ||
                         AuxiliaryPaneMoveFocus(FocusNavigationDirection.First))
                     {
                         e.Handled = true;
                     }
                 }
             }
         }
     }
     else if (e.Key == Key.Up)
     {
         UIElement popupChild = _popup.TryGetChild();
         if (popupChild != null &&
             !popupChild.IsKeyboardFocusWithin)
         {
             // If the popup does not have focus with in then try moving focus to
             // last element of FooterPane and then to the last element of
             // auxiliary pane if needed.
             if (FooterPaneMoveFocus(FocusNavigationDirection.Last) ||
                 AuxiliaryPaneMoveFocus(FocusNavigationDirection.Last))
             {
                 e.Handled = true;
             }
         }
         else
         {
             DependencyObject element = e.OriginalSource as DependencyObject;
             if (element != null)
             {
                 UIElement auxilaryPaneHost = AuxiliaryPaneHost;
                 if (auxilaryPaneHost != null &&
                     auxilaryPaneHost.IsKeyboardFocusWithin &&
                     TreeHelper.IsVisualAncestorOf(auxilaryPaneHost, element))
                 {
                     DependencyObject nextFocus = RibbonHelper.PredictFocus(element, FocusNavigationDirection.Up);
                     if (nextFocus == null ||
                         nextFocus == element)
                     {
                         // If the focus is on last first element of auxiliary pane,
                         // then try moving focus to last element of Items Pane and
                         // then to last element of FooterPane if needed.
                         if (ItemsPaneMoveFocus(FocusNavigationDirection.Last) ||
                             FooterPaneMoveFocus(FocusNavigationDirection.Last))
                         {
                             e.Handled = true;
                         }
                     }
                 }
             }
         }
     }
     else if (e.Key == Key.Left ||
              e.Key == Key.Right)
     {
         DependencyObject element = e.OriginalSource as DependencyObject;
         if (element != null)
         {
             if ((e.Key == Key.Left) == (FlowDirection == FlowDirection.LeftToRight))
             {
                 UIElement auxilaryPaneHost = AuxiliaryPaneHost;
                 if (auxilaryPaneHost != null &&
                     auxilaryPaneHost.IsKeyboardFocusWithin &&
                     TreeHelper.IsVisualAncestorOf(auxilaryPaneHost, element))
                 {
                     // If the effective key is left and the focus is on left most element
                     // of auxiliary pane, then move focus to nearest element to the left of
                     // auxiliarypane.
                     DependencyObject nextFocus = RibbonHelper.PredictFocus(element, FocusNavigationDirection.Last);
                     if (nextFocus != null &&
                         !TreeHelper.IsVisualAncestorOf(auxilaryPaneHost, nextFocus))
                     {
                         if (RibbonHelper.Focus(nextFocus))
                         {
                             e.Handled = true;
                         }
                     }
                 }
             }
             else if (e.Key == Key.Left)
             {
                 ScrollViewer subMenuScrollViewer = SubMenuScrollViewer;
                 if (subMenuScrollViewer != null &&
                     subMenuScrollViewer.IsKeyboardFocusWithin &&
                     TreeHelper.IsVisualAncestorOf(subMenuScrollViewer, element))
                 {
                     // If the flow direction is RightToLeft and the key is Left,
                     // and the focus is in items pane, move the the focus outside teh
                     // items pane if needed.
                     RibbonMenuItem menuItem = element as RibbonMenuItem;
                     if (menuItem == null)
                     {
                         menuItem = TreeHelper.FindVisualAncestor <RibbonMenuItem>(element);
                     }
                     if (menuItem != null &&
                         !menuItem.CanOpenSubMenu)
                     {
                         DependencyObject nextFocus = menuItem.PredictFocus(FocusNavigationDirection.Right);
                         if (nextFocus != null)
                         {
                             if (RibbonHelper.Focus(nextFocus))
                             {
                                 e.Handled = true;
                             }
                         }
                     }
                 }
             }
         }
     }
     base.OnPreviewKeyDown(e);
 }