Назначьте горячую клавишу на MenuItem (файл), чтобы удалить его - PullRequest
0 голосов
/ 06 июля 2010

У меня проблема с выпадающим меню «Файл» с помощью горячей клавиши Alt + F . Я успешно смог удалить его, если нажать и отпустить Alt , а затем F , открыть меню, но нажатие клавиши f с помощью alt не помогает. Это код, который я использую.

< Menu Name="File_Menu" Background="LightGray">

< MenuItem Header="_File" Background="LightGray" Name="File_FileMenu" > 

Использование подчеркивания в начале файла позволяет открыть меню, сначала нажав и отпустив Alt , а затем F

Я бы хотел, чтобы меню файлов выпало, когда обе клавиши нажаты вместе.

это код, который я использовал ранее для назначения горячей клавиши

KeyGesture keyGestureAltF = new KeyGesture (Key.F, ModifierKeys.Alt);
CommandBinding commandAltFBinding = new CommandBinding (CustomCommands.commandAltF, CommandBinding_FileMenu);
CustomCommands.commandAltF.InputGestures.Add (keyGestureAltF);
this.CommandBindings.Add (commandAltFBinding);

private void CommandBinding_FileMenu(object sender,ExecutedRoutedEventArgs e)
{ }

Я бы просто хотел, чтобы какой-то код был помещен в {} фигурные скобки.

1 Ответ

0 голосов
/ 06 июля 2010

Если вы посмотрите на ControlTemplate для MenuItem в WPF, вы увидите, что он использует примитив PopUp с ItemsControl для отображения меню.

Чтобы вручную запустить MenuItem, необходимо установить PopUp.IsOpen = true;.

Теперь ... Я не могу вспомнить, выставлено ли свойство IsOpen на MenuItem, вам может понадобиться пройтись по визуальному дереву, чтобы найти ссылку на него.

MyVisualTreeHelper, который использует написанную мной оболочку (как и многие другие до меня) для быстрого обхода визуального дерева. Часть этого ниже.

public static class MyVisualTreeHelper
{
  static bool AlwaysTrue<T>(T obj) { return true; }

  /// <summary>
  /// Finds a parent of a given item on the visual tree. If the element is a ContentElement or FrameworkElement 
  /// it will use the logical tree to jump the gap.
  /// If not matching item can be found, a null reference is returned.
  /// </summary>
  /// <typeparam name="T">The type of the element to be found</typeparam>
  /// <param name="child">A direct or indirect child of the wanted item.</param>
  /// <returns>The first parent item that matches the submitted type parameter. If not matching item can be found, a null reference is returned.</returns>
  public static T FindParent<T>(DependencyObject child) where T : DependencyObject
  {
    return FindParent<T>(child, AlwaysTrue<T>);
  }

  public static T FindParent<T>(DependencyObject child, Predicate<T> predicate) where T : DependencyObject
  {
    DependencyObject parent = GetParent(child);
    if (parent == null)
      return null;

    // check if the parent matches the type and predicate we're looking for
    if ((parent is T) && (predicate((T)parent)))
      return parent as T;
    else
      return FindParent<T>(parent);
  }

  static DependencyObject GetParent(DependencyObject child)
  {
    DependencyObject parent = null;
    if (child is Visual || child is Visual3D)
      parent = VisualTreeHelper.GetParent(child);

    // if fails to find a parent via the visual tree, try to logical tree.
    return parent ?? LogicalTreeHelper.GetParent(child);
  }
}

НТН,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...