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;
        }
    }
    复制代码
  • 相关阅读:
    java中next()、nextInt()、nextLine()区别
    原码、反码、补码及移位运算
    微信小程序开发流程(适用于新手学习)
    Dubbo 常用的容错机制
    分布式系统性能注意点
    陌上人如玉,公子世无双!
    五步工作法
    四个凡是
    Javacpu 和内存问题排查步骤
    开启JMC功能
  • 原文地址:https://www.cnblogs.com/wpf123/p/3672641.html
Copyright © 2011-2022 走看看