在WPF中设置快捷键,比如ctrl+Enter,shif+D。可否借参考下MyHotKeyClass
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在WPF中设置快捷键,比如ctrl+Enter,shif+D。可否借参考下MyHotKeyClass相关的知识,希望对你有一定的参考价值。
网上的MyHotKeyClass,我参照写了,但是不作用,所以想请高手帮我写个参考下
http://zhidao.baidu.com/question/131099510.html?si=1#
我试过,自定义命令是不支持“Shift+字母”这样的快捷键组合的。至于钩子,C#似乎并不支持真正的钩子,而且钩子有被杀毒软件误杀的可能性。
在主窗口的PreviewKeyDown事件中处理也会存在问题。——中文输入法打开时无效。
所以我是用输入法切换这个办法,一旦发现中文输入法打开
if (e.key == Key.ImeProcessed)
//MessageBox.Show(……
,就弹出个消息框,用户点击后自动关闭中文输入法:
System.Windows.Input.InputMethod.Current.ImeState =InputMethodState.Off;
——但这个办法显然不是太好。
实际上,即使中文输入法打开时,如果可以从PreviewKeyDown事件的参数e中取到“用户按下了哪个字母键引起了输入法的输入行为”,就可以解决“Shift+字母”组合键的问题了。但很遗憾,取不到——MSDN的说法应该并不正确(我在网上查过,似乎确实是.net的问题)。如果哪位高人知道如何取此字母键,请务必分享,先谢过。哈哈。
至于用遍历的办法判断二十六个字母键是否处于被按下状态我没试过。
ctrl+Enter貌似倒是比较容易实现:在PreviewKeyDown事件中判断用户是否按下了这个组合键,然后实现自定义逻辑,再令:e.Handled=true;
即可。 参考技术A <Window.Resources>
<RoutedUICommand x:Key="Play" Text="play" />
<RoutedUICommand x:Key="Stop" Text="stop" />
<RoutedUICommand x:Key="Back" Text="back" />
<RoutedUICommand x:Key="Advance" Text="advance" />
<RoutedUICommand x:Key="Reaset" Text="reaset" />
</Window.Resources>
<Window.InputBindings>
<KeyBinding Modifiers="Ctrl+Alt" Key="I" Command="StaticResource Play"/>
<KeyBinding Gesture="Ctrl+Alt+2" Command="StaticResource Stop"/>
<KeyBinding Gesture="Ctrl+Alt+3" Command="StaticResource Back"/>
<KeyBinding Gesture="Ctrl+Alt+4" Command="StaticResource Advance"/>
<KeyBinding Gesture="Ctrl+Alt+5" Command="StaticResource Reaset"/>
</Window.InputBindings>
<Window.CommandBindings>
<CommandBinding Command="StaticResource Play"
CanExecute="CommandBinding_CanExecute"
Executed="CommandBinding_Executed"/>
<CommandBinding Command="StaticResource Stop"
CanExecute="CommandBinding_CanExecute"
Executed="CommandBinding_Executed_1"/>
<CommandBinding Command="StaticResource Back"
CanExecute="CommandBinding_CanExecute"
Executed="CommandBinding_Executed_2"/>
<CommandBinding Command="StaticResource Advance"
CanExecute="CommandBinding_CanExecute"
Executed="CommandBinding_Executed_3"/>
<CommandBinding Command="StaticResource Reaset"
CanExecute="CommandBinding_CanExecute"
Executed="CommandBinding_Executed_4"/>
</Window.CommandBindings>
这个是我写过的一个项目的例子。。参考下 参考技术B 这个我也不怎么会,我就想回下:怎么样给菜单项"打开"加上快捷键Ctrl+O,并且按这个组合键时能够 真正起作用!
WPF中怎样设置ctrl或shift+字母键为快捷键啊?
我想在WPF中设置快捷键,比如ctrl+Enter,shif+D。请高手们帮忙啊......
没有直接在 xaml 设定的办法.但是可以写一个通用类, 以扩展的附加属性附加到所有的 UIElement. (已经写好了, 但不贴出来了, 留点思考). 但给个大概的.
先说写好这个类后, 在 xaml 中如何对 UIElement 设置快捷键.
假定这个类叫 MyHotKeyClass, 在命名空间 WPFApp1 上.
下面是一份 xaml 档, Window 为根元素, 包含一个 StackPanel, 而 StackPanel 有 Button, Image 两个子元素, 现在对 Button 设置快捷键 为 Ctrl + F, 对应 Click 事件; 对 Image 设置快捷键为 Shift + D, 对应 MouseLeftButtonDown 事件:
首先在 Window 引用 xmlns
<Window ...
xmlns:sk="clr-namespace:WPFApp1"
...>
<StackPanel>
<Button Content="Button"
sk:MyHotKeyClass.AccessKey="F"
sk:MyHotKeyClass.ModifierKey="Control"
sk:MyHotKeyClass.RoutedEvent="x:Static Button.ClickEvent"
Click="Button_Click"
/>
<Image Source="C:\wpf.jpg" Stretch="None"
sk:MyHotKeyClass.AccessKey="D"
sk:MyHotKeyClass.ModifierKey="Shift"
sk:MyHotKeyClass.RoutedEvent="x:Static Image.MouseLeftButtonDownEvent"
MouseLeftButtonDown="Image_MouseLeftButtonDown"
/>
</StackPanel>
</Window>
只是写一个类, 然后 就可以在各个 xaml 引用了, 非常简单.
但如何编写这个 MyHotKeyClass 呢?
首先, 它是一个普通类, (有些网站说非要从 DependencyObject 衍生, 其实不是必须的), 从上面设置可以看出, 它至少有三个 附加属性 (DependencyProperty): AccessKey, ModifierKey, RoutedEvent.
于是有了下面这个类的结构:
namespace WPFApp1
public class MyHotKeyClass
// 设置一个 AccessKey 的附加属性
public static readonly DependencyProperty AccessKeyProperty
= DependencyProperty.RegisterAttached("AccessKey", typeof(Key), typeof(MyHotKeyClass), new UIPropertyMetadata(...));
public static Key GetAccessKey(DependencyObject source)
...
return (Key)source.GetValue(AccessKeyProperty);
public static void SetAccessKey(DependencyObject source, Key value)
...
source.SetValue(AccessKeyProperty, value);
// 其余两个 ModifierKey 和 RoutedEvent 对应的元数据类型分别是
// typeof(ModifierKeys) 和 typeof(RoutedEvent)
// 详细的就不写了, 和第一个 AccessKey 的定法基本上一致.
最后测试这个类的工作, 在 Window 对应的类下写好按钮 Click 事件:
... Button_Click(...)
MessageBox.Show("Button was clicked");
... Image_MouseLeftButtonDown(...)
...
当按下 Ctrl + F 时, 就相当于点击了按钮, 当按下 Shift + D 时就相当于在 Image 控件上点了鼠标左键.
-------- END ----
关键点是 写好 DependencyProperty.
Good Luck 参考技术A
给你一段给button绑定Ctrl+V键的代码,如附件,
以上是关于在WPF中设置快捷键,比如ctrl+Enter,shif+D。可否借参考下MyHotKeyClass的主要内容,如果未能解决你的问题,请参考以下文章