Как я могу переключить видимость главного меню с помощью клавиши Alt в WPF?
-
10-07-2019 - |
Вопрос
Я бы хотел, чтобы главное меню в моем приложении 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);
}