2009-09-08 17 views
5

Chcę, aby z obsługi podglądu PreviewTextInput został utworzony nowy kontrolek i fokus jest ustawiony na to. Ale nawet po wywołaniu funkcji Focus() na nowym sterowaniu kursor nadal znajduje się w starym polu tekstowym. Handler UserControl_PreviewTextInput jest zarejestrowany w UserControl, który zawiera to pole tekstowe, jeśli ma to znaczenie.WPF: Nie można ustawić ostrości

private void UserControl_PreviewTextInput(object sender, TextCompositionEventArgs e) 
{ 
      CodeLineControl el = new CodeLineControl(); 
      container.Children.Insert(idx+1, el); 
      el.innerTextBox.Focus(); 
} 

CodeLineControl jest zdefiniowany tak (uproszczony):

<UserControl ..> 
    <DockPanel Name="codeline" Background="AntiqueWhite" >   
     <TextBox Name="innerTextBox"/>  
    </DockPanel> 
</UserControl> 

Czy istnieją jakieś ograniczenia dotyczące Focus(), że IAM nie awre o? Czy nie mogę przenieść Focus() z dala od TextBox od handler'a PreviewTextInput? Czy nie mogę ustawić fokusu na nowo utworzonych elementach?

Odpowiedz

3

Tworzenie DispatcherTimer który wywołuje skupić się na tym polu tekstowym po opóźnieniu

+0

Dlaczego jest to wymagane? Dodałem nową kontrolkę do gui, więc powinno być widoczne i możliwe do ustawienia. – codymanix

+0

Myślę, że zostanie on wyrenderowany asynchronicznie w osobnym wątku i nie można się na nim skupić, dopóki to nie zostanie ukończone. Lub może być tak, że po dodaniu nowej kontroli, WPF zmienia samo skupienie. Być może zdarzenie LostFocus jest w pewnym momencie uruchamiane? Możesz napisać plik dziennika, aby zobaczyć, jakie kontrolki uzyskują/tracą fokus. http://www.julmar.com/blog/mark/PermaLink,guid,6e4769e5-a0b3-47b2-a142-6dfefd0c028e.aspx –

18

Jest to metoda rozszerzenie używam bo zamiast Focus:

public static void BackgroundFocus(this UIElement el) 
    { 
     Action a =() => el.Focus(); 
     el.Dispatcher.BeginInvoke(DispatcherPriority.Background, a); 
    } 

Nie potrzeba stworzenia czasomierza.

+2

świetne rozwiązanie! +1 – Dabblernl

+0

Kradnę twój kodek! Zmieniam nazwę na ['FocusLikeChuckNorris'] (http://www.chucknorrisfacts.com)! (+1) –

Powiązane problemy