none
TextBox Focus RRS feed

  • Frage

  • Hallo,

    irgendwie ist für mich das Focus setzen in WPF oft eine riesen Herausforderung.

    Ich setze bei einem gewissen Event den Focus in die TextBox.

    Funktioniert wunderbar, aber wenn ich diesen Vorgang 4-5 mal wiederhole, funktioniert es nicht mehr.

    Setze ich mir einen Breakpoint dann funktioniert es wunderbar.

    Selbst bei diesem Code funktioniert es nicht andauern:

     Private Sub SetFocus()
    
             txtSuche.Focus()
             FocusManager.SetFocusedElement(Me, txtSuche)
             Keyboard.Focus(txtSuche)
    
             Me.Dispatcher.BeginInvokeSystem.Windows.Threading.DispatcherPriority.ContextIdle, Sub()
                                                                                                   txtSuche.Focus()
                                                                                                   FocusManager.SetFocusedElement(Me, txtSuche)
                                                                                                   Keyboard.Focus(txtSuche)
    
                                                                                                End Sub)
          End Sub

    Hat wer eine Idee?

    Vielen Dank.

    MfG

    Montag, 24. Juli 2017 07:56

Antworten

  • Hi Patrick,
    protokolliere doch einfach mal. Dass es zufällig ein paar Mal läuft, weist auf "racing conditions" zwischen parallel laufenden Threads hin. Wenn beispielsweise PropertyChanged von einem anderen Thread ausgelöst wird und im Abonnenten nicht thread-sichere Objekte genutzt werden, kann es zu einem Fehler kommen, der unbehandelt u.U. ignoriert wird, obwohl da im Framework viele Verbesserungen in den neueren Versionen eingeführt wurden. Im Ergebnis wird dann die Ereignisroutine nicht mehr aufgerufen, weil sie "abgestürzt" war. Um das zu finden hilft nur lückenloses try/catch auch in den Hintergrund-Threads.  

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Dienstag, 25. Juli 2017 08:03

Alle Antworten

  • Hi,
    Deine Beschreibung lässt vermuten, dass es asynchron parallel laufende Prozesse gibt, die selbst den Focus woandershin setzen. Mit einem Haltepunkt "beruhigen" sich diese asynchronen Prozesse und alles funktioniert wie gewünscht. Es bleibt also die Frage, was wird noch parallel gemacht und warum blockierst (synchronisierst) Du diese Aktivitäten nicht.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Montag, 24. Juli 2017 08:08
  • Hi,

    naja eigentlich wird etwas vom Server geholt und ich reagiere auf das PropertyChangedEvent.

    Hier sind eigentlich alle "Hintergrundaktionen" abgeschlossen.

    Das komische ist halt einfach, dass es 4-5 mal funktioniert ohne Probleme und plötzlich wird der Focus nicht mehr gesetzt.

    Eine Idee?

    MfG

    Patrick

    Dienstag, 25. Juli 2017 07:55
  • Hi Patrick,
    protokolliere doch einfach mal. Dass es zufällig ein paar Mal läuft, weist auf "racing conditions" zwischen parallel laufenden Threads hin. Wenn beispielsweise PropertyChanged von einem anderen Thread ausgelöst wird und im Abonnenten nicht thread-sichere Objekte genutzt werden, kann es zu einem Fehler kommen, der unbehandelt u.U. ignoriert wird, obwohl da im Framework viele Verbesserungen in den neueren Versionen eingeführt wurden. Im Ergebnis wird dann die Ereignisroutine nicht mehr aufgerufen, weil sie "abgestürzt" war. Um das zu finden hilft nur lückenloses try/catch auch in den Hintergrund-Threads.  

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Dienstag, 25. Juli 2017 08:03
  • Hallo Peter,

    ich habe jetzt nachgeschaut.

    Es werden alle meine Aktionen mit "Await" aufgerufen.

    Sobald ich mir Haltepunkte setze funktioniert es jedesmal. Bzw auch wenn ich es 4 mal mache.

    Kann es irgendetwas damit  zu tun haben, dass das Gesamtfenster in verschiedenen UserControl's ist und nicht alles in einem UserControl?

    MfG

    Pat

    Mittwoch, 2. August 2017 07:59
  • Hi,
    auch wenn Du es nicht akzeptieren willst, so sind die einzige Erklärung Deines geschilderten Problems "racing conditions". In Deinem geposteten Codeauszug nutzt Du BeginInvoke. Das ist nicht erforderlich, solange Du Dich im Thread befindest, in welchem die Steuerelemente erzeugt wurden. Du Nutzung von Dispatcher.BeginInvoke ist üblicherweise in einem anderen Thread anzuwenden, um auf Steuerelemente thread-übergreifend zuzugreifen.

    Async und Await erzeugen selbst noch keinen eigenen Thread. Das machen die aufgerufenen Methoden. Wenn die aufgerufenen Methoden keinen Thread starten, dann ist auch async/await sinnlos.

    Wenn es in den UserControls keine asynchron laufenden Threads gibt, dann haben sie nichts mit Deinem Problem zu tun.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 2. August 2017 08:51