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;
}
}

wpf实现IE菜单栏自动隐藏效果的更多相关文章

  1. 折腾linux随笔 之 关闭Budgie默认自动隐藏应用的菜单栏 与 Gnome系桌面应用菜单无内容解决

    关闭Budgie默认自动隐藏应用菜单栏 首选项 -> 设置 -> 通用辅助功能 -> 打开 始终显示通用辅助菜单 后的开关 -> 注销桌面重新登录. done. 解决Gnome ...

  2. WPF文本框密码框添加水印效果

    WPF文本框密码框添加水印效果 来源: 阅读:559 时间:2014-12-31 分享: 0 按照惯例,先看下效果 文本框水印 文本框水印相对简单,不需要重写模板,仅仅需要一个VisualBrush ...

  3. td之overflow:hidden 多余文本隐藏效果

    td之overflow:hidden 多余文本隐藏效果 方法1: table-layout: fixed; width: 200px; 语法: table-layout : auto | fixed ...

  4. CSS设置一行文字,超出部分自动隐藏

    .textone { overflow: hidden; text-overflow: ellipsis; display: -webkit-box; line-height: 25px; max-h ...

  5. iOS开发-自动隐藏键盘及状态栏

    1.隐藏状态栏 iOS升级至7.0以后,很多API被废止,其中原有隐藏状态栏StatusBar的方法就失效了. 原有方案 [[UIApplication sharedApplication] setS ...

  6. 菜鸟学JS(三)——自动隐藏的悬浮框

    今天写一个小实例,用js和css写一个可以自动隐藏的悬浮框.css肯定是用来控制样式的,js用来控制器显示与隐藏的.显示与隐藏通常有两种方法实现:1,用js控制其显示属性:2,用js控制其大小. 今天 ...

  7. Echarts X轴内容过长自动隐藏,鼠标移动上去显示全部名称方法

    最近公司做项目,使用echarts做开发,碰到一些数据的名称很长导致图例展示的效果不是很好,自己写了一个方法,当X轴内容过长时自动隐藏,鼠标移动上去显示全部名称 样例: 图二是鼠标移动到名称显示的,怎 ...

  8. wpf仿qq边缘自动停靠,支持多屏

    wpf完全模仿qq边缘自动隐藏功能,采用鼠标钩子获取鼠标当前状态,在通过当前鼠标的位置和点击状态来计算是否需要隐藏. 以下是实现的具体方法: 一.鼠标钩子实时获取当前鼠标的位置和点击状态 /// &l ...

  9. hexo干货系列:(八)hexo文章自动隐藏侧边栏

    前言 使用Jacman主题的时候发现打开具体文章后,侧边栏还是会展示,我想要的效果是自动隐藏侧边栏,并且展示目录.但是当我修改了主题配置文件里面close_aside属性为true的时候,发现侧边栏隐 ...

随机推荐

  1. 计算直线的交点数(set + 打表)

    计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  2. 文件atime未变问题的研究

    1. atime, ctime 以及mtime 这三个名词属于文件/文件夹的属性,存在于inode数据结构之中. 通过系统调用stat可以获取stat结构,其中包括:atime(accesstime) ...

  3. Hacker(12)----个人计算机安全防护策略

    了解了黑客的常用入侵方法,针对这些方法分别指定对应的防护策略不太现实,因此用户只能掌握个人计算机安全的常见防护策略,以确保计算机处在一个相对安全的环境中.常见个人计算机防护策略有:安装并及时升级杀毒软 ...

  4. Android学习笔记--广播(Broadcast)

    1.Android广播分类 android的广播类型分为两类:标准广播和有序广播. 标准广播:异步广播,广播发出后,所有注册了的广播接收器都会同时接收到该广播.打个比方:做地铁过程中的语音播报,当列车 ...

  5. CLR via C# - Char_String

    .NET中Char表示为16为的Unicode值,Char提供两个public const字段MinValue('\0',写成'\u0000'也是一样的)和MaxValue('\uffff'). Ch ...

  6. vue中关于computed的一点理解

    computed相当于属性的一个实时计算,如果实时计算里关联了对象,那么当对象的某个值改变的时候,同事会出发实时计算. 例子: <body id="content"> ...

  7. js中的eval方法转换对象时,为何一定要加上括号?

    待转换的是一个Json字符串: {'name':'新欢'} 而使用如下这种方式调用则会抛出语法异常, eval("{'name':'新欢'}"); 必须加上括号才行 eval(&q ...

  8. MongoDB学习笔记04

    创建索引使用ensureIndex方法,对于同一个集合,同样的索引只需要创建一次,反复创建是徒劳的. 对某个键的索引会加速对该键的查询,然而,对于其它查询可能没有帮助,即便是查询中包含了被索引的键.实 ...

  9. (转) Data structures

      Data structures A data structure is a group of data elements grouped together under one name. Thes ...

  10. 字符串在 UNICODE、MBCS编码下面的区别

    1:SBCS (single byte character set)单字节字符集.在这种编码格式下,所有字符都用一个字节表示.ASCII码就是单字节字符.用“0”来表示一个字节的结束.2 :Unico ...