乔·怀特(Joe White)是正确的,一些控件会自己处理键盘事件,这样就会对更高级别的控件掩盖它们。如果你查看Reflector中的AutoCompleteBox,你会发现Enter、Escape和F4都会导致某些事情发生并标记e.Handled = true。
不幸的是,在Silverlight世界中不存在PreviewKeyDown。
我已经找到了一种方法来防止控件响应和捕获这些键盘事件,那就是子类化控件并重写OnKeyDown方法。像这样的东西将允许您控制控件是否对键盘事件做出反应:
public class MyAutoCompleteBox : AutoCompleteBox
{
public static readonly DependencyProperty HandleKeyEventsProperty = DependencyProperty.Register(
"HandleKeyEvents",
typeof(bool),
typeof(MyAutoCompleteBox),
new PropertyMetadata(true));
public bool HandleKeyEvents
{
get { return (bool)GetValue(HandleKeyEventsProperty); }
set { SetValue(HandleKeyEventsProperty, value); }
}
protected override void OnKeyDown(KeyEventArgs e)
{
if (this.HandleKeyEvents)
{
base.OnKeyDown(e);
}
}
}
您可以使用XAML中的HandleKeyEvents属性禁用控件处理它们:
<local:MyAutoCompleteBox HandleKeyEvents="False"/>
这种做法可以防止基础的AutoCompleteBox将e.Handled = true标记,从而允许事件冒泡,以便您的更高级别控件可以对其进行其他操作。如果您想要防止其他KeyDown事件(除Enter之外)中断,可以更具体地处理哪些键被处理。