2010-10-19 13 views
5

Ich habe ein Tab-Steuerelement und ein paar Registerkarte Elemente. Ich höre erfolgreich das Ereignis SelectionChanged und überprüfe, ob der Tab, an dem ich interessiert bin, der aktuell ausgewählte ist.WPF TabControl On SelectionChanged, setzen Sie den Fokus auf ein Textfeld

Ich benutze diesen Code (unten), und beim Durchlaufen des Debuggers kann ich sehen, dass meine Verzweigungslogik wie vorgesehen funktioniert; Das Problem, das ich habe, ist jedoch, dass etwas diesen Aufruf an txt.Focus() überschreibt, da nach dem Anzeigen des richtigen Registerkartenelements der Fokus nicht auf dem Textfeld ist.

private void tabMain_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    // exact same behavior with and without this line 
    e.Handled = true; 

    if (e.AddedItems.Contains(usrTab)) 
    { 
     txtusr.Focus(); 
    } 
    else if (e.AddedItems.Contains(svcTab)) 
    { 
     txtsvc.Focus(); 
    } 
} 

Wenn ich in eine Schaltfläche Event-Handler setzen txtusr.Focus() nur, es konzentriert sich genau so, wie ich erwarten würde.

Ich vermute, dass dies mit dem Tabitem-Inhalt zu dem Zeitpunkt, als die .Focus()-Methode aufgerufen wird, nicht geladen wird, aber ich bin mir nicht sicher, wie es geht, um es zu beheben.

+0

Haben Sie das Problem extern zu Ihrem Code isoliert, um zu sehen, ob es reproduzierbar ist? Wenn dies der Fall ist, handelt es sich um ein Timing-/Framework-Problem, und dann können Sie das Problem mit diesem Wissen etwas anders angehen. –

+0

konnte ich dies in einem Stub-Programm inkonsistent reproduzieren. – Nate

Antwort

10

Versuchen Sie, die .Focus() - Aufrufe in einen Dispatcher.BeginInvoke zu setzen.

Dispatcher.BeginInvoke(new Action(() => { txtsvc.Focus(); })); 
+0

Ich habe keine Threading-Ausnahme erhalten, aber dies hat das Problem behoben. Vielen Dank. – Nate

+2

Ja, in diesem Fall geht es nicht wirklich um Threads. Einige Steuerelemente verwenden Dispatcher.Invoke/BeginInvoke intern. Wenn Sie Ihre Aufgabe am Ende der Dispatcher-Warteschlange hinzufügen, lassen Sie alles zu, bevor es beendet wird (solange Ihre Aufgabe die gleiche oder eine niedrigere Priorität hat als alles andere). Das ist zumindest mein Verständnis. – mdm20