我怎么可以切换的主菜单可见度使用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
活动的窗口。来检测 Alt 关键你会需要检查 SystemKey
酒店的 KeyEventArgs
, 而不是关键的财产,通常使用对于大多数其他的钥匙。
你可以使用这一事件来设置一个 bool
值已被宣布为 DependencyProperty
在窗户代码后面。
菜单上的 Visibility
酒店然后可以开这种财产的使用 BooleanToVisibilityConverter
.
<Menu
Visibility={Binding Path=IsMenuVisibile,
RelativeSource={RelativeSource AncestorType=Window},
Converter={StaticResource BooleanToVisibilityConverter}}
/>
其他提示
我会试着找到处理的 PreviewKeyDown
事件在你的窗口。我不确定如果按Alt触发这一事件或者没有,但如果这样做,那么我切换一个 bool
这是必要的可见度的主菜单窗口。
如果 PreviewKeyDown
不行,我不确定还有什么要尝试。你可以看得到的实际Windows消息发送给你的窗口,但是,这可能会导致混乱的速度非常快。
它将更好地使用 GetKeyboardState
与 VK_MENU
处理这两个左右 Alt, ,以模仿的行为的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);
}