zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    复制代码
  • 相关阅读:
    什么是ORM
    ORM优缺点
    Azure 中快速搭建 FTPS 服务
    连接到 Azure 上的 SQL Server 虚拟机(经典部署)
    在 Azure 虚拟机中配置 Always On 可用性组(经典)
    SQL Server 2014 虚拟机的自动备份 (Resource Manager)
    Azure 虚拟机上的 SQL Server 常见问题
    排查在 Azure 中新建 Windows 虚拟机时遇到的经典部署问题
    上传通用化 VHD 并使用它在 Azure 中创建新 VM
    排查在 Azure 中新建 Windows VM 时遇到的部署问题
  • 原文地址:https://www.cnblogs.com/wpf123/p/3672641.html
Copyright © 2011-2022 走看看