it-roy-ru.com

Keyboard.Focus не работает с текстовым полем в WPF

Я бьюсь головой о том, что похоже на такую ​​простую проблему, которую нужно исправить в wpf, но мне еще предстоит выяснить, почему я не могу заставить свое приложение вести себя в соответствии с моим планом. 

У меня есть небольшое окно поиска, которое появляется в моем приложении wpf, когда пользователь нажимает Ctrl + F. Все, что я хочу, это чтобы курсор вставал в текстовое поле окна поиска, готовый принять любой пользовательский ввод без необходимости нажимать на него. Вот код xaml для текстового поля, которое видно, включено, доступно для проверки, доступно для табуляции и фокусировки.

   <TextBox x:Name="SearchCriteriaTextBox" Text="{Binding SearchCriteria}" Focusable="True" IsEnabled="True" IsTabStop="True" IsHitTestVisible="True" Style="{DynamicResource SearchTextBoxStyle}" Grid.Column="1" Margin="5,10,0,5" />

В приведенном ниже коде этот метод вызывается, когда на видимость окна поиска влияют. окно поиска загружается в начале приложения.

    /// <summary>
    /// Handles events triggered from focusing on this view.
    /// </summary>
    /// <param name="sender">The sender.</param>
    /// <param name="dependencyPropertyChangedEventArgs">The key event args.</param>
    private void OnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
    {
        if (!((bool) dependencyPropertyChangedEventArgs.NewValue))
        {
            return;
        }

        SearchCriteriaTextBox.Focus();
        Keyboard.Focus(SearchCriteriaTextBox);
        SearchCriteriaTextBox.Select(0, 0);

        if (SearchCriteriaTextBox.Text.Length > 0)
        {
            SearchCriteriaTextBox.SelectAll();
        }
    }

Проблема в том, что код вызывается, компонент становится IsFocused = true, но не получает фокус клавиатуры. Я что-то пропустил? Если другой элемент управления не будет свирепо удерживать фокус клавиатуры, который, я уверен, я не кодировал, почему этот кусок довольно простого кода не будет работать должным образом.

17
legrandviking

В качестве обходного пути вы можете попробовать использовать Dispatcher, чтобы установить фокус на более поздний DispatcherPriority , такой как Input

Dispatcher.BeginInvoke(DispatcherPriority.Input,
    new Action(delegate() { 
        SearchCriteriaTextBox.Focus();         // Set Logical Focus
        Keyboard.Focus(SearchCriteriaTextBox); // Set Keyboard Focus
     }));

Судя по описанию вашей проблемы, у вас не настроен фокус клавиатуры. WPF может иметь несколько областей фокусировки, поэтому несколько элементов могут иметь логический фокус (IsFocused = true), однако только один элемент может иметь фокус клавиатуры и будет получать ввод с клавиатуры.

Код, который вы опубликовали, должен правильно установить фокус, поэтому после этого должно произойти что-то, чтобы вывести Keyboard Focus из вашей TextBox. Установив фокус на более поздний приоритет диспетчера, вы убедитесь, что настройка фокуса клавиатуры на SearchCriteriaTextBox будет выполнена последней.

55
Rachel

Если кому-то это помогло, у меня возникла эта проблема, и в моем приложении было главное окно с несколькими пользовательскими элементами управления, размещенными в отдельных сетках с привязкой данных видимости. Поскольку сетки были там, когда приложение было построено, .Focus (), вызываемый для Loaded или Constructor, будет вызываться во время сборки, а не во время видимости. 

Во всяком случае, я исправил это, вызвав .Focus () для события MouseEnter сетки. У меня отлично работает.

0
Cristian G