2009-09-08 16 views
5

Voglio che dal gestore di PreviewTextInput venga creato un nuovo controllo e che lo stato attivo sia impostato su di esso. Ma anche dopo aver chiamato Focus() sul nuovo controllo, il cursore si trova ancora nella vecchia casella di testo. Il gestore UserControl_PreviewTextInput è registrato su UserControl che contiene questa casella di testo, se ciò è importante.WPF: Impossibile impostare lo stato attivo

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

CodeLineControl è definita come quella (semplificato):

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

ci sono alcune limitazioni sulla Focus() che Iam non Awre circa? Non sono autorizzato a spostare Focus() da un TextBox da un gestore di PreviewTextInput? Non posso concentrare l'attenzione sugli elementi appena creati?

risposta

3

Creare un DispatcherTimer che chiama Focus su quel testo dopo un ritardo

+0

Perché è necessario? Ho aggiunto il nuovo controllo alla GUI quindi dovrebbe essere visibile e focalizzabile. – codymanix

+0

Penso che venga visualizzato in modo asincrono in un thread separato e non è possibile concentrarsi su di esso fino a quando non è completo. Oppure, potrebbe essere che dopo l'aggiunta di un nuovo controllo, WPF cambi l'attenzione stessa. Forse l'evento LostFocus è sparato ad un certo punto? È possibile scrivere un file di registro per vedere quali controlli stanno ottenendo/perdere l'attenzione. http://www.julmar.com/blog/mark/PermaLink,guid,6e4769e5-a0b3-47b2-a142-6dfefd0c028e.aspx –

18

Questo è il metodo di estensione che uso per invece di messa a fuoco:

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

Non c'è bisogno di creare un timer.

+2

ottima soluzione! +1 – Dabblernl

+0

Rubo il tuo codice! Ho cambiato il nome in ['FocusLikeChuckNorris'] (http://www.chucknorrisfacts.com)! (+1) –

Problemi correlati