Как переключить видимость главного меню с помощью клавиши Alt в WPF? - PullRequest
8 голосов
/ 02 августа 2009

Мне бы хотелось, чтобы главное меню в моем приложении WPF работало так же, как главное меню в IE8:

  • не видно при запуске приложения
  • нажатие и отпускание Alt делает его видимым
  • нажатие и отпускание Alt снова делает его невидимым
  • повторить, пока не скучно

Как я могу это сделать? Это должен быть код?

Добавлено в ответ на представленные ответы, потому что у меня все еще проблемы:

Код моего Shell теперь выглядит так:

public partial class Shell : Window
{
    public static readonly DependencyProperty IsMainMenuVisibleProperty;

    static Shell()
    {
        FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();
        metadata.DefaultValue = false;

        IsMainMenuVisibleProperty = DependencyProperty.Register(
            "IsMainMenuVisible", typeof(bool), typeof(Shell), metadata);
    }

    public Shell()
    {
        InitializeComponent();

        this.PreviewKeyUp += new KeyEventHandler(Shell_PreviewKeyUp);
    }

    void Shell_PreviewKeyUp(object sender, KeyEventArgs e)
    {
        if (e.SystemKey == Key.LeftAlt || e.SystemKey == Key.RightAlt)
        {
            if (IsMainMenuVisible == true)
                IsMainMenuVisible = false;
            else
                IsMainMenuVisible = true;
        }
    }

    public bool IsMainMenuVisible
    {
        get { return (bool)GetValue(IsMainMenuVisibleProperty); }
        set { SetValue(IsMainMenuVisibleProperty, value); }
    }
}

Ответы [ 4 ]

8 голосов
/ 02 августа 2009

Вы можете использовать событие PreviewKeyDown в окне. Чтобы обнаружить ключ Alt , вам нужно проверить свойство SystemKey KeyEventArgs, в отличие от свойства Key, которое вы обычно используете для большинства других ключей.

Вы можете использовать это событие для установки значения bool, которое было объявлено как DependencyProperty в коде Windows позади.

Свойство Visibility меню можно затем привязать к этому свойству с помощью BooleanToVisibilityConverter.

<Menu 
    Visibility={Binding Path=IsMenuVisibile, 
        RelativeSource={RelativeSource AncestorType=Window},
        Converter={StaticResource BooleanToVisibilityConverter}}
    />
1 голос
/ 18 мая 2011

Я только что столкнулся с этой проблемой сам.Я попытался подключиться к событию PreviewKeyDown, но нашел его ненадежным.Вместо этого я нашел класс InputManager, где вы можете подключиться к EnterMenuMode из управляемого кода.Менеджер выставляет два события, для входа и выхода.Хитрость заключается в том, чтобы не свернуть меню, а установить его высоту контейнера на ноль, когда его нужно скрыть.Чтобы показать его, просто очистите локальное значение, и оно получит прежнюю высоту.

Из моего пользовательского элемента управления TopMenu:

public TopMenu()
{
    InitializeComponent();
    InputManager.Current.EnterMenuMode += OnEnterMenuMode;
    InputManager.Current.LeaveMenuMode += OnLeaveMenuMode;
    Height = 0;
}

private void OnLeaveMenuMode(object sender, System.EventArgs e)
{
    Height = 0;
}

private void OnEnterMenuMode(object sender, System.EventArgs e)
{
    ClearValue(HeightProperty);
}
1 голос
/ 02 августа 2009

Было бы лучше использовать GetKeyboardState с VK_MENU для обработки левого и правого Alt , чтобы имитировать поведение IE / Windows Explorer (Vista +), которое вы ' Вам нужно будет отслеживать ранее сфокусированный элемент для сохранения фокуса при нажатии VK_MENU, пока фокусированный элемент находится в вашем главном меню. Вы также хотите выполнять эту работу на PreviewKeyUp (не вниз).

1 голос
/ 02 августа 2009

Я бы попробовал разобраться с событием PreviewKeyDown в вашем окне. Я не уверен, вызывает ли нажатие Alt это событие или нет, но если это произойдет, то я бы переключил bool, который связан с видимостью главного меню окна.

Если PreviewKeyDown не работает, я не уверен, что еще можно попробовать. Вы можете посмотреть на фактические сообщения Windows, отправленные в ваше окно, но это может очень быстро запутаться.

...