wpf实现IE菜单栏自动隐藏效果

IE菜单栏默认为隐藏状态,按下键盘Alt键后显示,菜单失去焦点则自动隐藏。下面说说WPF中如何实现这样的效果。

第一步:Menu默认设置为隐藏(Visibility="Collapsed"),这里不应该设置为"Hidden",因为菜单栏隐藏后其他控件需要自动填补菜单栏隐藏后的空缺。Visibility="Hidden"只是界面上不显示而已,Menu控件的位置还是被占用着。

第二步:响应键盘Alt键,然后显示出Menu。这里需要用到WPF中的隧道事件(PreviewXXX),从根元素开始响应,这样不论焦点在哪个控件上,都能得到KeyDown事件。例子中是在Window根节点添加PreviewKeyDown事件。

第三步:响应键盘焦点(KeyboardFocus),GotFocus则显示,LostFocus则隐藏。

第四步:由于还能通过键盘组合键的方式来打开菜单,所以还要响应ContextMenuOpening事件,不论Menu由于什么原因Opening了,菜单栏都需要为显示状态。

<Window x:Class="IEMenu.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" PreviewKeyDown="Window_PreviewKeyDown">
    <DockPanel>
        <Menu x:Name="menu" DockPanel.Dock="Top" VerticalAlignment="Top" Visibility="Collapsed"
              GotKeyboardFocus="menu_GotKeyboardFocus"
              LostKeyboardFocus="menu_LostKeyboardFocus"
              ContextMenuOpening="menu_ContextMenuOpening">
            <MenuItem Header="文件(_F)">
                <MenuItem Header="打开(_O)..." />
                <MenuItem Header="保存(_S)" />
                <MenuItem Header="另存为(_A)..." />
                <Separator />
                <MenuItem Header="退出(_Q)" />
            </MenuItem>
            <MenuItem Header="帮助(_H)">
                <MenuItem Header="清除日志(_C)" Click="MenuItem_Click" />
                <MenuItem Header="帮助(_H)" />
                <Separator />
                <MenuItem Header="关于(_A)" />
            </MenuItem>
        </Menu>
        <Border Background="Aquamarine" BorderBrush="Black" BorderThickness="5" CornerRadius="10">
            <ListBox x:Name="log" />
        </Border>
    </DockPanel>
</Window>

 

后台代码如下:

private void menu_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {
    menu.Visibility = Visibility.Visible;
}

private void menu_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {
    menu.Visibility = Visibility.Collapsed;
}

private void menu_ContextMenuOpening(object sender, ContextMenuEventArgs e) {
    menu.Visibility = Visibility.Visible;
}

private void Window_PreviewKeyDown(object sender, KeyEventArgs e) {
    if(e.SystemKey == Key.LeftAlt || e.SystemKey == Key.RightAlt) {
        if(menu.Visibility != Visibility.Visible) menu.Visibility = Visibility.Visible;
    }
}

相关推荐:

如何在 MoviePy 中实现以图像中心为锚点的缩放动画效果

MoviePy默认的resize变换以左上角为缩放原点,导致zoom效果偏离中心;本文详解通过组合set_position与动态尺寸调整,配合CompositeVideoClip实现真正居中缩放的完整方案。 moviepy默认的`resize`变换以左上角为缩放原点,导致zoom效果偏离中心;本文详...

MoviePy 中实现图像中心缩放(Zoom)效果的正确方法

MoviePy默认缩放以左上角为锚点,本文详解如何通过组合set_position与动态尺寸调整,实现真正的中心锚点缩放(如平滑zoom-in/out),并给出可直接运行的代码示例与关键注意事项。 moviepy默认缩放以左上角为锚点,本文详解如何通过组合`set_position`与动态尺寸调整,...

Python如何隐藏源代码只发布字节码_打包pyc文件与代码混淆

不能。.pyc文件无法真正隐藏Python源码,uncompyle6等工具可快速反编译还原代码;其仅能阻止非专业查看者,需结合pyarmor混淆、Cython编译或运行时解密等手段提升逆向门槛。 Python发布时能靠.pyc文件真正隐藏源码吗? 不能。直接分发.pyc文件对防逆向几乎无效——unc...

如何在 PyCharm 中正确粘贴 Word 文档内容(避免乱码与隐藏格式)

从word复制文本到pycharm时常出现不可见空格、异常引号、全角字符或替换为“小n”“大o”等乱码,根本原因是word自带富文本格式(如智能引号、软回车、零宽空格等)未被ide正确解析;本文提供高效、无损的清理方案。 从word复制文本到pycharm时常出现不可见空格、异常引号、全角字符或替换...