2012-12-19 13 views
15

Wbijam sobie głowę w coś, co wygląda na taki prosty problem do naprawienia w wpf, ale muszę jeszcze odkryć, dlaczego nie mogę sprawić, aby moja aplikacja zachowywała się zgodnie z moim plan.Keyboard.Focus nie działa w polu tekstowym w WPF

Mam małe pole wyszukiwania, które pojawia się w mojej aplikacji wpf, gdy użytkownik naciśnie ctrl + f. Wszystko, czego chcę, to flashowanie karku w polu tekstowym pola wyszukiwania, gotowe do podjęcia wszelkich danych wprowadzanych przez użytkownika bez konieczności klikania przez użytkownika. Oto kod xaml dla pola tekstowego, który jest widoczny, włączony, trafiony, możliwy do ustawienia i umożliwiający ustawianie ostrości.

<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" /> 

W kodzie źródłowym mam tę metodę wywoływaną, gdy wpływa ona na widoczność pola wyszukiwania. pole wyszukiwania jest ładowane na początku aplikacji.

/// <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(); 
     } 
    } 

Problem polega na wywołaniu kodu, składnik staje się IsFocused = true, ale nie uzyskuje ostrości klawiatury. Czy czegoś brakuje? O ile inna kontrola nie trzyma w skupieniu ostrości klawiatury, jestem pewien, że nie kodowałem, dlaczego ten kawałek prostego kodu nie działałby prawidłowo.

+2

Spróbuj zrobić to po załadowanym wydarzeniu. –

+1

Przypuszczam, że inna kontrola skupia się po wywołaniu tej metody. Może powinieneś skupić się na innym wydarzeniu. – Ramin

+0

@HighCore Mam pytanie: Czy ładowane zdarzenie jest uruchamiane za każdym razem, gdy zmienia się widoczność? – Ramin

Odpowiedz

50

Jako obejście, można spróbować użyć Dispatcher aby ustawić ostrość na późniejszy DispatcherPriority, takich jak Input

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

z opisu problemu, to brzmi jak nie masz aktywnego dla klawiatury zestaw. WPF może mieć wiele zakresów ostrości, więc wiele elementów może mieć Logiczną Ostrość (IsFocused = true), jednak tylko jeden element może mieć Ostrość Klawiatury i będzie odbierany z klawiatury.

Kod, który wysłałeś, powinien prawidłowo ustawić fokus, więc później musisz coś zrobić, aby przenieść Focus klawiatury z twojego TextBox. Ustawiając fokus na późniejszy priorytet dyspozytora, będziesz mieć pewność, że ustawienie ostrości na klawiaturze na SearchCriteriaTextBox zostanie wykonane jako ostatnie.

+1

Właśnie odkryłem, że chciałem opublikować moją własną odpowiedź, dzięki Rachel to działa idealnie w środowisku wielowątkowym. EDYCJA: Możesz wywołać Dispatcher.BeginInvoke (DispatcherPriority.Input, new ThreadStart (() => SearchCriteriaTextBox.Focus())); do tego samego wyniku, bez konieczności wywoływania funkcji textbox focus – legrandviking

+0

Działa to dla mnie: MessageBox.Show ("foo"); myTextBox.Select (0, myTextBox.Text.Length); myTextBox.Skupiać(); – Krafty

+0

Czy ktoś ma wyjaśnienie tego problemu? –

0

Jeśli to pomaga każdemu mam ten problem, a moja aplikacja miała główne okno z wieloma kontrolkami użytkownika umieszczonymi w oddzielnych siatkach z wiązaniem danych widoczności. Ponieważ siatki były tam, kiedy aplikacja została zbudowana, funkcja .Focus() wywoływana w trybie Loaded lub Constructor była wywoływana w czasie kompilacji, a nie w czasie widoczności.

W każdym razie naprawiłem to, wywołując .Focus() w zdarzeniu MouseEnter siatki. Działa dobrze dla mnie.

Powiązane problemy