WPF提供了基础的键盘类(System.Input.Keyboard类),该类提供与键盘相关的时间、方法和属性,这些事件、方法和属性提供有关键盘状态的信息。
Keyboard的事件也通过UIElement等XAML基元素类的事件向外提供。
对于键盘操作,其常用的事件有两组:
KeyDown事件和PreviewKeyDown事件:
处理键盘键按下KeyUp事件和PreviewKeyUp事件:处理键盘键抬起
其中KeyDown和KeyUp事件属于冒泡路由事件,而PreviewKeyDown和PreviewKeyup属于隧道路由事件。
为了使元素能够接收键盘输入,该元素必须可获得焦点。默认情况下,大多数UIElement 派生对象都可获得焦点。如果不是这样,则要使元素可获得焦点,请将基元素上的 Focusable 属性设置为 true。
像 StackPanel 和 Canvas这样的 Panel 类将 Focusable 的默认值设置为 false。因此,对要获取键盘焦点的这些对象而言,必须将 Focusable 设置为 true。
焦点的这些对象而言,必须将 Focusable 设置为 true。例如:在笔者的Notebook中有“静音”、“增大音量”、“减小音量”这三个快捷键,在一个应用程序的窗体上处理这三个键的点击可以:
<Window x:Class="InputCommandAndFocus.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="480"
Focusable="True" PreviewKeyDown="Window_PreviewKeyDown">
<Canvas>
</Canvas>
</Window>
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.VolumeMute)
{
// 按下“静音”键
txtMessage.Text = "Mute";
e.Handled = true;
}
else if
(e.Key == Key.VolumeUp)
{
// 按下“增大音量”键
txtMessage.Text = "Up";
e.Handled = true;
}
else if (e.Key == Key.VolumeDown)
{
// 按下“减小音量”键
txtMessage.Text = "Down";
e.Handled = true;
}
}