Вы можете использовать присоединенное свойство зависимостей типа bool.
Привязать его к свойству publi c bool в вашей модели просмотра.
Установите для него значение true, если вы хотите сфокусировать элемент управления.
У меня есть небольшой код. Не могу вспомнить, написал я это или взял в Интернете. И я не могу припомнить, чтобы на самом деле он использовал его.
public static class FocusExtension
{
public static bool GetIsFocused(DependencyObject obj)
{
return (bool)obj.GetValue(IsFocusedProperty);
}
public static void SetIsFocused(DependencyObject obj, bool value)
{
obj.SetValue(IsFocusedProperty, value);
}
public static readonly DependencyProperty IsFocusedProperty =
DependencyProperty.RegisterAttached(
"IsFocused", typeof(bool), typeof(FocusExtension),
new UIPropertyMetadata(false, OnIsFocusedPropertyChanged));
private static async void OnIsFocusedPropertyChanged(
DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
var uie = (UIElement)d;
if ((bool)e.NewValue)
{
await Task.Delay(200);
uie.Focus();
Keyboard.Focus(uie);
}
}
}
Эта задержка задачи await вводит ожидание в 200 мс, так что sh другие вещи могут завершить все, что они делают. Вместо этого вы можете отложить фокусировку с помощью диспетчера.
Application.Current.Dispatcher.InvokeAsync(new Action(() =>
{
uie.Focus();
Keyboard.Focus(uie);
}), DispatcherPriority.ContextIdle);
Из-за замыканий этот код будет захватывать все, что u ie находится в области действия.