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?

priyanka.sarkar
quelle

Antworten:

144

In XAML:

<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
   <TextBox Name="Box" />
</StackPanel>
nützlichBee
quelle
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();
  }
}
Peter Huber
quelle
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,
49

Versuchen Sie es mit FocusManager.SetFocusedElement

FocusManager.SetFocusedElement(parentElement, txtCompanyID)
Arsen Mkrtchyan
quelle
5
Was passiert , wenn das Element , das Sie auf Set Fokus wollen ist das übergeordnete Element oO?
Brock Hensley
10
FocusManager.SetFocusedElement (FocusManager.GetFocusScope (parentElement), parentElement);
Philter
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.

Svetlozar Angelov
quelle
19

Versuche dies : MyTextBox.Focus ( );

NazOok
quelle
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}" />
Anya Hoffnung
quelle
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.

anemomylos
quelle
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.

Alex Russkov
quelle