Подход, который я использовал, был аналогичен идее vorrtex, но не требует добавления ссылки на System.Windows.Interactivity
. Вы создаете логическое присоединенное свойство с помощью обработчика событий, когда оно изменяется.Добавьте это свойство в свой контент-контроль в xaml.Когда свойство добавляется, запускается обработчик событий, и здесь вы можете подписаться на полученное событие фокуса в вашем элементе управления контентом.
В обработчике полученного события фокуса вы перемещаете фокус на следующий объект, который будет содержимым!Убедитесь, что вы установили IsTabStop = False для элемента управления контентом, иначе вы не сможете Shift + Tab из содержимого.
public static bool? GetFocusContent(DependencyObject obj)
{
return (bool?)obj.GetValue(FocusContentProperty);
}
public static void SetFocusContent(DependencyObject obj, bool? value)
{
obj.SetValue(FocusContentProperty, value);
}
public static readonly DependencyProperty FocusContentProperty =
DependencyProperty.RegisterAttached("FocusContent", typeof(bool?), typeof(MyClassName),
new UIPropertyMetadata(OnFocusContentChanged));
static void OnFocusContentChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
if (((bool?)e.NewValue).Value == true)
{
ContentControl cControl = obj as ContentControl;
if (cControl!= null)
{
cControl.GotFocus += OnGotFocus;
}
}
}
static void OnGotFocus(object sender, RoutedEventArgs e)
{
ContentControl cControl = sender as ContentControl;
// You should check the original source against the sender to make sure that
// you don't prevent focus from getting to a child of your content.
if (cControl != null && e.OriginalSource == sender)
{
cControl.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}
}