WPF之给使用了模板的MenuItem添加快捷操作
说在前面:
WPF中给按钮或者是具备Command等元素实现快捷键其实是非常简单的,例子如下:
<Button Content="_Test" Click="Button_Click_1"></Button>
XAML代码很简单,一个Button,设置了Content和事件,细心的小盆友会发现Content的前缀是一个_,这个可不是一般的下划线哦,因为你在运行时候是看不到这个下划线的,这就是快捷键的神奇之处,现在运行程序按下 "Alt+T",你会发现好神奇竟然执行了Click事件。
解释:WPF中的快捷键定义规则是在文本的前边加上下划线,然后按下Alt和下划线后的字母即可实现,比如上例子中我们下划线后边的是T,所以我们按下Alt+t就可以实现快捷操作,当然你也可以是A--Z都ok的。
窃喜:有小盆友开始发现一个致命问题,如果我们内容是中文怎么办,难道我也必须在前边放一个字母吗,这个问题难道我了,可是难不倒WPF,上例子:
<Button Content="测试(_T)" Click="Button_Click_1"></Button>
哈哈哈,是不是觉得我很坏呢,可是这个就是解决办法,看看VS中的菜单,是不是都是这样的形式呢,同样运行按下Alt+t是不是执行了Click呢,当然对于英文如果我们的快捷键并不是首字母同样可以采取这样的方法。
进入正文:
<ControlTemplate TargetType="{x:Type MenuItem}" x:Key="headMenuItemTemplate" >
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<Rectangle Fill="#FF505050"
Name="be"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"></Rectangle>
<Label HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Content="{TemplateBinding Header}"
Name="backLbl"
Margin="10,0,10,0"
Padding="10,0,10,0"
Foreground="#FFC1C1C1"
Visibility="Collapsed"
>
</Label>
<Label HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Content="{TemplateBinding Header}"
Name="contLbl"
Margin="10,0,10,0"
Padding="10,0,10,0"
Foreground="White"
></Label>
<Popup Name="Popup"
Placement="Bottom"
IsOpen="{TemplateBinding IsSubmenuOpen}"
AllowsTransparency="True"
Focusable="False"
PopupAnimation="Slide"
>
<StackPanel Orientation="Horizontal"
SnapsToDevicePixels="True"
MinWidth="{TemplateBinding ActualWidth}" >
<Border x:Name="DropDownBorder"
BorderThickness="1"
BorderBrush="Black"
HorizontalAlignment="Center"
Width="{TemplateBinding ActualWidth}"
>
<Border.Background>
<SolidColorBrush Color="#FF535353" />
</Border.Background>
<ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden"
HorizontalAlignment="Center"
>
<StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" />
</ScrollViewer>
</Border>
</StackPanel>
</Popup>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="True">
<Setter TargetName="contLbl" Property="Visibility" Value="Visible"></Setter>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="contLbl" Property="Visibility" Value="Collapsed"></Setter>
</Trigger>
<EventTrigger RoutedEvent="UIElement.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetName="be"
Storyboard.TargetProperty="Fill.Color"
To="Black"
Duration="0:0:0.4"
>
</ColorAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="UIElement.MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetName="be"
Storyboard.TargetProperty="Fill.Color"
To="#FF505050"
Duration="0:0:0.4"
>
</ColorAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
上述代码如果觉得好复杂,可以复制到自己的页面中,其实就是一个MenuItem的模板,并且控制了启用和禁用下的样式,就这么多功能。其中最复杂的就是Popup部分,其实就是用于展现子菜单使用的,所以还是要写上的。
使用模板:
<MenuItem Header="打开(_O)" Template="{StaticResource headMenuItemTemplate}" >
<MenuItem Header="_Best" Click="MenuItem_Click_1" Template="{StaticResource defaultMenuItemTemplate}" ></MenuItem>
<MenuItem Header="_Cest" Click="MenuItem_Click_2" Template="{StaticResource defaultMenuItemTemplate}" ></MenuItem>
<MenuItem Header="_Dest" Click="MenuItem_Click_3" Template="{StaticResource defaultMenuItemTemplate}" ></MenuItem>
</MenuItem>
使用也很简单,运行程序,按下Alt+O,你很难过的发现为什么菜单不会展开呢,哈哈哈,因为代码有问题所以展不开,另外你会发现手动点击开按下子菜单对应的快捷键(B,C,D)竟然没反应,别急按下键同时按下Enter回车即可。
解释:为什么会展不开呢,因为代码少东西:
<!--菜单高亮的时候展开子菜单-->
<Trigger Property="IsHighlighted" Value="true">
<Setter Property="IsOpen" Value="True" TargetName="Popup"/>
</Trigger>
上述代码我们只针对Enable做了除了,可是当菜单高亮的时候并没有做任何东西,所以加上上述的代码即可,IsOpen是Popup的属性,这样按下快捷键就可以展开菜单了,是不是很简单呢。
好了,这篇东西蛮简单,大家有好的建议多交流。
WPF之给使用了模板的MenuItem添加快捷操作的更多相关文章
- WPF学习之深入浅出话模板
图形用户界面应用程序较之控制台界面应用程序最大的好处就是界面友好.数据显示直观.CUI程序中数据只能以文本的形式线性显示,GUI程序则允许数据以文本.列表.图形等多种形式立体显示. 用户体验在GUI程 ...
- WPF Step By Step 自定义模板
WPF Step By Step 自定义模板 回顾 上一篇,我们简单介绍了几个基本的控件,本节我们将讲解每个控件的样式的自定义和数据模板的自定义,我们会结合项目中的具体的要求和场景来分析,给出我们实现 ...
- WPF实现选项卡效果(2)——动态添加AvalonDock选项卡
原文:WPF实现选项卡效果(2)--动态添加AvalonDock选项卡 简介 在前面一篇文章里面,我们使用AvalonDock实现了类似于VS的选项卡(或者浏览器的选项卡)效果.但是我们是通过xaml ...
- webapi修改tt模板给字段添加JsonIgnore特性解决转换json循环引用问题
0.问题描述 EF生成的model带有导航属性,则json序列化会报循环引用错误,尝试如下 protected void Application_Start() { GlobalConfigurati ...
- opencv笔记4:模板运算和常见滤波操作
time:2015年10月04日 星期日 00时00分27秒 # opencv笔记4:模板运算和常见滤波操作 这一篇主要是学习模板运算,了解各种模板运算的运算过程和分类,理论方面主要参考<图像工 ...
- WPF中通过代码定义模板
WPF中可以再XAML中定义模板,也可以通过C#代码定义模板,通过代码可能更清楚的看清其逻辑,而且代码的好处就是可以随时动态的去操作,而在XAML中定义的一般都是静态的. //控件呈现的显示内容1(这 ...
- WPF学习(10)模板
在前面一篇我们粗略说了Style和Behaviors,如果要自定义一个个性十足的控件,仅仅用Style和Behaviors是不行的,Style和Behaviors只能通过控件的既有属性来简单改变外观, ...
- wpf中的样式与模板
1.WPF样式类似于Web应用程序中的CSS,在WPF中可以为控件定义统一的样式(Style).样式属于资源的一种,例如为Button定义统一的背景颜色和字体: <Window.Resource ...
- WPF有关控件和模板样式设计的微软官方文档
说明 如果你正在使用WPF开发应用程序,相信这篇博客会对你有用.希望你能认真的阅读 正文 此文主要以Button为例进行介绍此文档的组成部分. Button Parts Button控件没有任何命名的 ...
随机推荐
- 04_例子讲解:rlViewDemo.exe
参考资料:http://www.roboticslibrary.org/tutorials/first-steps-windows 使用rlViewDemo对应的快捷方式启动程序,可以看到如下界面: ...
- 关于webview嵌入swf
有的机子CPU不支持swf播放的,不知道你是不是中奖了.. webview 加载swf很简单: if(versionDouble>=2.2){//版本低于2.2的系统无法播放sw ...
- C++中执行windows指令
执行windows指令: BOOL ExecDosCmd(]) { SECURITY_ATTRIBUTES sa; HANDLE hRead,hWrite; sa.nLength = sizeof(S ...
- ASP.NET的WebFrom组件LinkButton使用
在ASP.NET的WebForm组件中的LinkButton组件也是一个服务器端的组件,这个组件有点类似于HTML中的<A>标识符.它的主要作用是就是在ASP.NET页面中显示一个超链接. ...
- gulp 不是内部或者外部命令 或者 webpack 不是内部或者外部命令
gulp安装也正常,但是就是查看gulp -v的时候报错,原因:缺少系统变量PATH或者PATH变量错误 提示:这个系统变量PATH,直接追加就好(多个变量值用分号;隔开),不要删除已经有的系统变量P ...
- php环境扩展包so
http://files.cnblogs.com/files/adtuu/no-debug-non-zts-20121212.zip /Applications/XAMPP/xamppfiles/li ...
- [译]线程生命周期-理解Java中的线程状态
线程生命周期-理解Java中的线程状态 在多线程编程环境下,理解线程生命周期和线程状态非常重要. 在上一篇教程中,我们已经学习了如何创建java线程:实现Runnable接口或者成为Thread的子类 ...
- [Interview][CodingExam]
這次去Interview, 其中有一個公司 把我列為 2/25的考慮對象, 在Final 的 1/2, 我被刷掉了. 因為第一輪的程式,我稍微google了一下,參考了既有的寫法. 即使第二輪我用完全 ...
- java 中的this关键字的几种用法
转自:http://blog.csdn.net/anmei2010/article/details/4091227 1. 当成员变量和局部变量重名时,在方法中使用this时,表示的是该方法所在 ...
- Python-Day1 Python基础学习
一.Python3.5.X安装 1.Windows Windows上找度娘搜索“Python for windows下载”就OK了,安装的时候可以勾选设置环境变量,也可以安装完手动设置,这样在cmd中 ...