Legen Sie den Fokus auf das Textfeld in WPF


104

So legen Sie den Fokus auf ein TextBoxElement in WPF fest

Ich habe diesen Code:

txtCompanyID.Focusable = true;
txtCompanyID.Focus();

... aber es funktioniert nicht.

Irgendeine Idee?

Antworten:


144

In XAML:

<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
   <TextBox Name="Box" />
</StackPanel>

9
Ich bevorzuge diesen Ansatz gegenüber den anderen oben genannten, da er mit MVVM übereinstimmt.
Todd Sprang

1
Fokussiertes Element ist schreibgeschützt richtig Wie können Sie in xaml einstellen? Ich habe dies verwendet und es hat nicht funktioniert. <Style.Triggers> <Trigger Property = "Validation.HasError" Value = "True"> <Setter Property = "FocusManager.FocusedElement" Value = "{Binding Source = {RelativeSource Self}}" /> </ Trigger> </Style.Triggers>
WPFKK

@ user841612, überprüfen Sie den folgenden Link und überprüfen Sie die Assembly und Namespace msdn.microsoft.com/en-us/library/…
nützlichBee

Dies funktioniert nur einmal. Wenn Sie den Fokus nach dem Erstellen der Seite ändern möchten, müssen Sie dies programmgesteuert tun.
Joe Steele

51

Bisher hat niemand erklärt, warum der Code in der Frage nicht funktioniert. Ich vermute, dass der Code im Konstruktor des Fensters platziert wurde. Zu diesem Zeitpunkt ist es jedoch noch zu früh, um den Fokus festzulegen. Dies muss erfolgen, sobald das Fenster für die Interaktion bereit ist. Der beste Ort für den Code ist das Loaded-Ereignis:

public KonsoleWindow() {
  public TestWindow() {
    InitializeComponent();
    Loaded += TestWindow_Loaded;
  }

  private void TestWindow_Loaded(object sender, RoutedEventArgs e) {
    txtCompanyID.Focus();
  }
}

1
logischerweise ist diese Antwort nach zu viel Mühe ziemlich gut und perfekt als Lösung.
Shivani

das hat bei mir funktioniert. die akzeptierte Antwort nicht. Danke
BoundForGlory

Focus()txtCompanyId.Focus(FocusState.Keyboard)
Dan,


25
txtCompanyID.Focusable = true;
Keyboard.Focus(txtCompanyID);

msdn:

Auf dem gesamten Desktop kann nur ein Element mit Tastaturfokus vorhanden sein. In WPF wird für das Element mit Tastaturfokus IsKeyboardFocused auf true gesetzt.

Sie können nach der Einstellungszeile brechen und den Wert der IsKeyboardFocusedEigenschaft überprüfen . Überprüfen Sie auch, ob Sie diese Linie wirklich erreichen, oder stellen Sie ein anderes Element ein, um danach den Fokus zu erhalten.


19

Versuche dies : MyTextBox.Focus ( );


2
Dies ist die eleganteste Antwort und erfordert nicht, dass Sie auch das übergeordnete Element angeben. Danke dafür, es funktioniert großartig für mich!
dbeachy1

Peter Hubers Antwort tut dies, erklärt aber, dass das Fenster zuerst geladen werden muss, weshalb meins nicht funktionierte
Adriaan Davel

14

Nichts davon funktionierte für mich, da ich eher ein Raster als ein StackPanel verwendete.

Ich habe endlich dieses Beispiel gefunden: http://spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/

und modifizierte es zu diesem:

Im Abschnitt "Ressourcen":

    <Style x:Key="FocusTextBox" TargetType="Grid">
        <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=textBoxName, Path=IsVisible}" Value="True">
                <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=textBoxName}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

In meiner Gitterdefinition:

<Grid Style="{StaticResource FocusTextBox}" />

2
Das hat auch bei mir funktioniert. Der Rest war nicht. Danke für den Link, das war sehr interessant. Interessant ist auch, dass so eine einfache Sache so kompliziert sein kann.
TravisWhidden

2
Die obige Antwort funktioniert einwandfrei, unabhängig davon, ob es sich bei dem Container um einen Gird oder ein StackPanel handelt. Da die Struktur Ihres Gitters nicht klar ist, ist es schwer zu sagen, was schief gelaufen sein könnte. Schön, Alternativen zu sehen.
nützlichBee

1
Für mich ist dies auch der einzige, der richtig funktioniert. Netter Weg.
OregonGhost

7

Falls Sie bei den anderen Antworten keine Lösung gefunden haben, habe ich das Problem auf diese Weise gelöst.

Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
    TEXTBOX_OBJECT.Focus();
}), System.Windows.Threading.DispatcherPriority.Render);

Soweit ich weiß, funktionieren die anderen Lösungen möglicherweise nicht, da der Aufruf von Focus()aufgerufen wird, bevor die Anwendung die anderen Komponenten gerendert hat.


3
Diese Antwort verdient einen besseren Rang.
Simon Mourier

0

Eine andere mögliche Lösung ist die Verwendung von FocusBehavior, das vom kostenlosen DevExpress MVVM Framework bereitgestellt wird :

<TextBox Text="This control is focused on startup">
    <dxmvvm:Interaction.Behaviors>
        <dxmvvm:FocusBehavior/>
    </dxmvvm:Interaction.Behaviors>
</TextBox>

Sie können ein Steuerelement fokussieren, wenn es geladen wird, wenn ein bestimmtes Ereignis ausgelöst oder eine Eigenschaft geändert wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.