Другая проблема WPF Set focus с помощью кнопки Button (элемент управления не дочерний во время разработки) - PullRequest
0 голосов
/ 06 августа 2020

У меня есть кнопка в окне WPF, которая добавляет элемент табуляции в элемент управления вкладками в окне. В этом случае также создается пользовательский элемент управления, который заполняет эту вкладку. Я хочу установить фокус на текстовое поле этого пользовательского элемента управления. Я пробовал все виды кода txt.Focus и т. Д., Но кнопка всегда остается в фокусе после выполнения события click.

Я не могу использовать это, поскольку текстовое поле не является частью xaml на это окно во время разработки.

MyAttachedProps: EventFocusAttachment.ElementToFocus = "{Binding ElementName = NotAvailableAtDesignTime}"

Единственное, что я могу придумать, - это таймер, который запускается после нажатия кнопки, но есть должен быть лучший способ.

1 Ответ

0 голосов
/ 06 августа 2020

Вы можете использовать присоединенное свойство зависимостей типа 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 находится в области действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...