说在前面:

WPF中给按钮或者是具备Command等元素实现快捷键其实是非常简单的,例子如下:

  1. <Button Content="_Test" Click="Button_Click_1"></Button>

XAML代码很简单,一个Button,设置了Content和事件,细心的小盆友会发现Content的前缀是一个_,这个可不是一般的下划线哦,因为你在运行时候是看不到这个下划线的,这就是快捷键的神奇之处,现在运行程序按下 "Alt+T",你会发现好神奇竟然执行了Click事件。

解释:WPF中的快捷键定义规则是在文本的前边加上下划线,然后按下Alt和下划线后的字母即可实现,比如上例子中我们下划线后边的是T,所以我们按下Alt+t就可以实现快捷操作,当然你也可以是A--Z都ok的。

窃喜:有小盆友开始发现一个致命问题,如果我们内容是中文怎么办,难道我也必须在前边放一个字母吗,这个问题难道我了,可是难不倒WPF,上例子:

  1. <Button Content="测试(_T)" Click="Button_Click_1"></Button>

哈哈哈,是不是觉得我很坏呢,可是这个就是解决办法,看看VS中的菜单,是不是都是这样的形式呢,同样运行按下Alt+t是不是执行了Click呢,当然对于英文如果我们的快捷键并不是首字母同样可以采取这样的方法。

进入正文:

  1. <ControlTemplate TargetType="{x:Type MenuItem}" x:Key="headMenuItemTemplate" >
  2. <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
  3.  
  4. <Rectangle Fill="#FF505050"
  5. Name="be"
  6. HorizontalAlignment="Stretch"
  7. VerticalAlignment="Stretch"></Rectangle>
  8.  
  9. <Label HorizontalAlignment="Stretch"
  10. VerticalAlignment="Stretch"
  11. HorizontalContentAlignment="Center"
  12. VerticalContentAlignment="Center"
  13. Content="{TemplateBinding Header}"
  14. Name="backLbl"
  15. Margin="10,0,10,0"
  16. Padding="10,0,10,0"
  17. Foreground="#FFC1C1C1"
  18. Visibility="Collapsed"
  19. >
  20. </Label>
  21. <Label HorizontalAlignment="Stretch"
  22. VerticalAlignment="Stretch"
  23. HorizontalContentAlignment="Center"
  24. VerticalContentAlignment="Center"
  25. Content="{TemplateBinding Header}"
  26. Name="contLbl"
  27. Margin="10,0,10,0"
  28. Padding="10,0,10,0"
  29. Foreground="White"
  30. ></Label>
  31. <Popup Name="Popup"
  32. Placement="Bottom"
  33. IsOpen="{TemplateBinding IsSubmenuOpen}"
  34. AllowsTransparency="True"
  35. Focusable="False"
  36. PopupAnimation="Slide"
  37. >
  38.  
  39. <StackPanel Orientation="Horizontal"
  40. SnapsToDevicePixels="True"
  41. MinWidth="{TemplateBinding ActualWidth}" >
  42. <Border x:Name="DropDownBorder"
  43. BorderThickness="1"
  44. BorderBrush="Black"
  45. HorizontalAlignment="Center"
  46. Width="{TemplateBinding ActualWidth}"
  47. >
  48. <Border.Background>
  49. <SolidColorBrush Color="#FF535353" />
  50. </Border.Background>
  51. <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True"
  52. HorizontalScrollBarVisibility="Hidden"
  53. VerticalScrollBarVisibility="Hidden"
  54. HorizontalAlignment="Center"
  55. >
  56. <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" />
  57. </ScrollViewer>
  58. </Border>
  59. </StackPanel>
  60. </Popup>
  61. </Grid>
  62.  
  63. <ControlTemplate.Triggers>
  64. <Trigger Property="IsEnabled" Value="True">
  65. <Setter TargetName="contLbl" Property="Visibility" Value="Visible"></Setter>
  66. </Trigger>
  67. <Trigger Property="IsEnabled" Value="False">
  68. <Setter TargetName="contLbl" Property="Visibility" Value="Collapsed"></Setter>
  69. </Trigger>
  70. <EventTrigger RoutedEvent="UIElement.MouseEnter">
  71. <BeginStoryboard>
  72. <Storyboard>
  73. <ColorAnimation
  74. Storyboard.TargetName="be"
  75. Storyboard.TargetProperty="Fill.Color"
  76. To="Black"
  77. Duration="0:0:0.4"
  78. >
  79. </ColorAnimation>
  80. </Storyboard>
  81. </BeginStoryboard>
  82. </EventTrigger>
  83.  
  84. <EventTrigger RoutedEvent="UIElement.MouseLeave">
  85. <BeginStoryboard>
  86. <Storyboard>
  87. <ColorAnimation
  88. Storyboard.TargetName="be"
  89. Storyboard.TargetProperty="Fill.Color"
  90. To="#FF505050"
  91. Duration="0:0:0.4"
  92. >
  93. </ColorAnimation>
  94. </Storyboard>
  95. </BeginStoryboard>
  96. </EventTrigger>
  97. </ControlTemplate.Triggers>
  98. </ControlTemplate>

上述代码如果觉得好复杂,可以复制到自己的页面中,其实就是一个MenuItem的模板,并且控制了启用和禁用下的样式,就这么多功能。其中最复杂的就是Popup部分,其实就是用于展现子菜单使用的,所以还是要写上的。
使用模板:

  1. <MenuItem Header="打开(_O)" Template="{StaticResource headMenuItemTemplate}" >
  2. <MenuItem Header="_Best" Click="MenuItem_Click_1" Template="{StaticResource defaultMenuItemTemplate}" ></MenuItem>
  3. <MenuItem Header="_Cest" Click="MenuItem_Click_2" Template="{StaticResource defaultMenuItemTemplate}" ></MenuItem>
  4. <MenuItem Header="_Dest" Click="MenuItem_Click_3" Template="{StaticResource defaultMenuItemTemplate}" ></MenuItem>
  5. </MenuItem>

使用也很简单,运行程序,按下Alt+O,你很难过的发现为什么菜单不会展开呢,哈哈哈,因为代码有问题所以展不开,另外你会发现手动点击开按下子菜单对应的快捷键(B,C,D)竟然没反应,别急按下键同时按下Enter回车即可。

解释:为什么会展不开呢,因为代码少东西:

  1. <!--菜单高亮的时候展开子菜单-->
  2. <Trigger Property="IsHighlighted" Value="true">
  3. <Setter Property="IsOpen" Value="True" TargetName="Popup"/>
  4. </Trigger>

上述代码我们只针对Enable做了除了,可是当菜单高亮的时候并没有做任何东西,所以加上上述的代码即可,IsOpen是Popup的属性,这样按下快捷键就可以展开菜单了,是不是很简单呢。
好了,这篇东西蛮简单,大家有好的建议多交流。

WPF之给使用了模板的MenuItem添加快捷操作的更多相关文章

  1. WPF学习之深入浅出话模板

    图形用户界面应用程序较之控制台界面应用程序最大的好处就是界面友好.数据显示直观.CUI程序中数据只能以文本的形式线性显示,GUI程序则允许数据以文本.列表.图形等多种形式立体显示. 用户体验在GUI程 ...

  2. WPF Step By Step 自定义模板

    WPF Step By Step 自定义模板 回顾 上一篇,我们简单介绍了几个基本的控件,本节我们将讲解每个控件的样式的自定义和数据模板的自定义,我们会结合项目中的具体的要求和场景来分析,给出我们实现 ...

  3. WPF实现选项卡效果(2)——动态添加AvalonDock选项卡

    原文:WPF实现选项卡效果(2)--动态添加AvalonDock选项卡 简介 在前面一篇文章里面,我们使用AvalonDock实现了类似于VS的选项卡(或者浏览器的选项卡)效果.但是我们是通过xaml ...

  4. webapi修改tt模板给字段添加JsonIgnore特性解决转换json循环引用问题

    0.问题描述 EF生成的model带有导航属性,则json序列化会报循环引用错误,尝试如下 protected void Application_Start() { GlobalConfigurati ...

  5. opencv笔记4:模板运算和常见滤波操作

    time:2015年10月04日 星期日 00时00分27秒 # opencv笔记4:模板运算和常见滤波操作 这一篇主要是学习模板运算,了解各种模板运算的运算过程和分类,理论方面主要参考<图像工 ...

  6. WPF中通过代码定义模板

    WPF中可以再XAML中定义模板,也可以通过C#代码定义模板,通过代码可能更清楚的看清其逻辑,而且代码的好处就是可以随时动态的去操作,而在XAML中定义的一般都是静态的. //控件呈现的显示内容1(这 ...

  7. WPF学习(10)模板

    在前面一篇我们粗略说了Style和Behaviors,如果要自定义一个个性十足的控件,仅仅用Style和Behaviors是不行的,Style和Behaviors只能通过控件的既有属性来简单改变外观, ...

  8. wpf中的样式与模板

    1.WPF样式类似于Web应用程序中的CSS,在WPF中可以为控件定义统一的样式(Style).样式属于资源的一种,例如为Button定义统一的背景颜色和字体: <Window.Resource ...

  9. WPF有关控件和模板样式设计的微软官方文档

    说明 如果你正在使用WPF开发应用程序,相信这篇博客会对你有用.希望你能认真的阅读 正文 此文主要以Button为例进行介绍此文档的组成部分. Button Parts Button控件没有任何命名的 ...

随机推荐

  1. 膜拜 2014-2 (献给L之三)

    文/安然 深深的夜静静的想你细细的品味满满的甜蜜爱,心灵的对话让我流泪战栗谢谢你给我这么弥足珍贵的体会不能一生相随又有什么关系你一直都在我的爱就永不停息此生足以——献给心底的爱

  2. 面向切面的Spring

    在软件开发中,发布于应用中多处的功能被称为横切关注点.通常,这些横切关注点从概念上是与应用的业务逻辑相分离的(但往往直接嵌入到应用的业务逻辑之中).将横切关注点与业务逻辑相分离是AOP所要解决的. 一 ...

  3. Hadoop fs命令详解

    本文非原创,转载自http://www.superwu.cn/2013/07/31/312 另外参考:http://www.blogjava.net/changedi/archive/2013/08/ ...

  4. php数组去重实例及分析

    php数组去重实例及分析.  一维数组的重复项: 使用array_unique函数即可,使用实例 <?php    $aa=array("apple","banan ...

  5. PHP curl 参数详解

    PHP curl参数详解,分享一下. curl_setopt (PHP 4 >= 4.0.2) curl_setopt -- 为CURL调用设置一个选项 描述 bool curl_setopt ...

  6. stm32之ADC学习

    1.stm32中采用的是逐次逼近型模拟数字方式,那么什么是逐次逼近呢? 逐次逼近的方式类似于二分法,以8位数据为例:当输入一个模拟量的时候,首先取这8位数的一半,即1000 0000,与模拟量比较,大 ...

  7. PAT乙级真题1005. 继续(3n+1)猜想 (25)(解题)

    原题: 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对n=3进行验证 ...

  8. (转)Qt Model/View 学习笔记 (三)——Model类

    Model类 基本概念 在model/view构架中,model为view和delegates使用数据提供了标准接口.在Qt中,标准接口QAbstractItemModel类中被定义.不管数据在底层以 ...

  9. ios 基于CAEmitterLayer的雪花,烟花,火焰,爱心等效果demo(转)

    转载自:http://blog.csdn.net/mad2man/article/details/16898369 分类: cocoa SDK2013-11-23 11:52 388人阅读 评论(0) ...

  10. python学习笔记4(列表)

    列表是最通用的Python复合数据类型,列表中包含以逗号分隔,并在方括号([])包含的项目. 在一定程度上,列表相似C语言中的数组,它们之间的一个区别是,所有属于一个列表中的项目可以是不同的数据类型的 ...