Как я могу переключить видимость главного меню с помощью клавиши Alt в WPF?

StackOverflow https://stackoverflow.com/questions/1218394

Вопрос

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

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

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

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

Мой код оболочки теперь выглядит следующим образом:

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); }
    }
}
Это было полезно?

Решение

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

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

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

<Menu 
    Visibility={Binding Path=IsMenuVisibile, 
        RelativeSource={RelativeSource AncestorType=Window},
        Converter={StaticResource BooleanToVisibilityConverter}}
    />

Другие советы

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

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

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

Я только что сам столкнулся с этой проблемой.Я попытался подключиться к 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top