一部のコントロールはキー イベントを独自に処理するため、より高いレベルのコントロールにそれらをマスクする効果があるという Joe White の意見は正しいです。Reflector の AutoCompleteBox を見ると、Enter、Escape、および F4 のすべてが何かを引き起こし、e.Handled = true とマークされていることがわかります。
残念ながら、PreviewKeyDown は Silverlight の世界には存在しません。
コントロールがこれらの重要なイベントに応答してキャプチャするのを防ぐことができた 1 つの方法は、コントロールをサブクラス化し、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 以外) が壊れないようにしたい場合は、どのキーが処理されたかをより具体的に知ることができます。