写在前面
之前更新的命令一章中,有一部分没讲,就是自定义命令,对这部分感兴趣的同学可以看一下这篇文章,算是对命令的扩展补充吧。
项目思路
我们在玩游戏和用一些软件的时候都会碰到这样的情况,用户可以根据自己的喜好来设置相关快捷键,今天我们要做的功能就是这个,功能的实现主要分为三步。第一步,创建自定义命令;第二步,识别用户的输入;第三步,绑定对应的快捷键。听上去好像挺容易的,试试看吧
创建自定义命令
public class CustomCommand
{
private static RoutedUICommand command1;
static CustomCommand()
{
InputGestureCollection inputs = new InputGestureCollection();
inputs.Add(new KeyGesture(Key.R, ModifierKeys.Control, "Ctrl+R"));
command1 = new RoutedUICommand("Command1", "Command1", typeof(CustomCommand), inputs);
}
public static RoutedUICommand Command1
{
get { return command1; }
}
}
我建议看不懂的同学,就直接看参数,反正我是看不懂。那就来看看参数,new KeyGesture(Key.R, ModifierKeys.Control, “Ctrl+R”) 看参数应该是绑定按键的,这个命令的默认快捷键应该是:“Ctrl+R”。 new RoutedUICommand(“Command1”, “Command1”, typeof(CustomCommand), inputs) 这个参数就不用看了,前两个应该是和定义的RoutedUICommand对象有关,第三个是类型,第四个是InputGestureCollection对象。这么一看还是挺简单的嘛。。。
<Window.CommandBindings>
<CommandBinding Command="local:CustomCommand.Command1" Executed="cmd_Executed"></CommandBinding>
</Window.CommandBindings>
这段代码就跟简单了,自定义的命令当然要有一个不同的出场方式了。Executed事件就更不用说了,命令有两个事件,还有一个CanExecuted这里并没有用到。
识别用户输入
识别用户输入,我第一时间的想法是用KeyDown事件来监听键盘事件,分别取得两次按下的按键值。
//.xaml
KeyDown="Txt1_KeyDown"
//.xaml.cs
private void Txt1_KeyDown(object sender, KeyEventArgs e)
{
if(txt1.IsFocused == true)
{
if(Keyboard.Modifiers!=0)
{
}
//txt1.Text = e.Key;
}
else if(txt2.IsFocused == true)
{ }
else
{ }
}
代码写到这里的时候我迷茫了,我突然想到快捷键不是按一下,而是在功能键按住的同时,再按字母键,而当按键按下并未抬起的时候,KeyDown事件是会持续不断的触发的,直到没有按键按下。那我怎么知道第二个按键是什么时候按下的呢,而且一直循环判断也会对应用程序产生负荷。
有时候换个思路,问题就能迎刃而解,既然KeyDown不行,那就用KeyUp试试看呗,
//.xaml
KeyUp="Window_KeyUp"
//.xaml.cs
private void Window_KeyUp(object sender, KeyEventArgs e)
{
if (Keyboard.Modifiers != 0)
{
if (txt1.IsFocused == true)
{
string i = e.Key.ToString();
string l = Keyboard.Modifiers.ToString();
txt1.Text = l + "+" + i;//界面显示设置的快捷键
dosomething(e.Key, Keyboard.Modifiers);//绑定对应的快捷键
}
else if (txt2.IsFocused == true)
{ }
else
{ }
}
}
只运行了一次就完美的解决了我们的问题。
绑定快捷键
现在用户输入的按键也获得了,自定义命令也找到了,剩下的就是怎么动态的将他们绑定在一起了,
<TextBox.InputBindings>
<KeyBinding Gesture="Ctrl+W" Command="Open"></KeyBinding>
</TextBox.InputBindings>
这是书上的内容,但是这样我们只能绑定固定的快捷键,没办法做到动态的更换,所以我根据这些代码写出了对应的动态逻辑代码,
private void dosomething(Key key,ModifierKeys modifierKeys)
{
txt1.InputBindings.Clear();
InputBinding inputBinding = new InputBinding(ApplicationCommands.Open, new KeyGesture(key, modifierKeys));
txt1.InputBindings.Add(inputBinding);
}
好了,一个完整的动态快捷键设置就完成了。
写在结尾
之前我推荐同学们多看书,我感觉有些同学就走进了一个误区,看书照着书上的代码写,然后运行,这个过程中你得到了什么呢,练习打字?那还不如用金山打字游戏。。。我的这个实战项目很简单,我相信看完这篇文章的大多数同学都会觉得简单,但是你真的会了么,就拿最后一步来说,从上面的固定绑定代码,到下面的动态逻辑代码,让你自己来,你会么?在这里还是要呼吁大家多看书,更要多写代码,我说的写代码可不是从书上抄下来,在解决问题的过程中学习,与君共勉!