Джо Уайт прав, что некоторые элементы управления обрабатывают ключевые события самостоятельно, что приводит к маскировке их для элементов управления более высокого уровня. Если вы посмотрите на AutoCompleteBox в Reflector, вы увидите, что Enter, Escape и F4 все вызывают что-то, и отметьте e.Handled = true.
К сожалению, PreviewKeyDown не существует в мире Silverlight.
Один из способов, которым я смог предотвратить реагирование элементов управления и захват этих ключевых событий, - это создать подкласс управления элементом управления и переопределить метод 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);
}
}
}
Затем можно использовать свойство HandleKeyEvents в XAML, чтобы отключить их обработку для элемента управления:
<local:MyAutoCompleteBox HandleKeyEvents="False"/>
Этот тип препятствует тому, чтобы базовый AutoCompleteBox когда-либо отмечал e.Handled = true, и позволял бы событию пузыриться, чтобы ваш высокоуровневый элемент управления мог с ним что-то делать. Можно было бы более точно указать, с какими ключами обрабатывается, если вы хотите предотвратить прерывание других событий KeyDown (кроме Enter).