Setzen Sie den Fokus auf ein Textfeld in xaml wpf


91

Trotz einiger Beiträge in diesem Forum und anderer kann ich nichts finden, das mir sagt, wie ich den Fokus auf a setzen soll TextBox.

Ich habe ein userControl mit vielen Beschriftungen und Textfeldern. Wenn das Formular geladen wird, soll die bestimmte Textbox den Fokus haben.

Ich habe den tabIndex eingestellt, aber das schien nicht zu funktionieren.

Irgendwelche Vorschläge?


Antworten:


177

Sie können die FocusManager.FocusedElementangehängte Eigenschaft für diesen Zweck verwenden. Hier ist ein Code, der den Fokus standardmäßig auf TxtB setzt.

<StackPanel Orientation="Vertical" FocusManager.FocusedElement="{Binding ElementName=TxtB}">
    <TextBox x:Name="TxtA" Text="A" />
    <TextBox x:Name="TxtB" Text="B" />
</StackPanel>

Sie können es auch TxtB.Focus()in Ihrem Code-Behind verwenden, wenn Sie dies in XAML nicht möchten.


13
@TarkaDaal: Der Kommentar "Es hat bei mir nicht funktioniert" könnte etwas ausführlicher sein. Es ist wahrscheinlich eine andere Kontrolle, die den Fokus stiehlt. Wenn der Fokuskrieg in WPF beginnt, neigen die Dinge dazu, ungezogen zu werden! Bitte überprüfen Sie Ihre Steuerelemente und wo Sie sich gerade im visuellen Baum befinden (z. B. in einer ComboBox-Vorlage hat dies keine Auswirkungen, und es gibt zahlreiche andere Fälle wie diesen). Wenn Sie den Stealer nicht finden können, verwenden Sie ein Verhalten oder einen Code-Behind, um den Fokus auf das Steuerelement zu setzen, wenn es geladen wird.
Julien Lebosquain

@ JulienLebosquain: Es war ein ziemlich einfaches Steuerelement, zwei Schaltflächen und eine Textbox in einem Raster (wo ich das FocusManagerZeug abgelegt habe ). Am Ende habe ich es im Code-Behind gemacht.
TarkaDaal

Das Mitglied "FocusedElement" wird nicht erkannt oder ist nicht zugänglich. :( plus.google.com/photos/+HendyIrawan/albums/5990385944888867505/…
Hendy Irawan

@HendyIrawan Ist das vielleicht ein Silverlight-Projekt?
MojoFilter

@ MojoFilter es ist ein Windows Phone 8 WPF-Projekt
Hendy Irawan

28

Sie können diese Eigenschaft direkt auf die TextBox anwenden:

<TextBox Text="{Binding MyText}" FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/>

16
Hat bei mir nicht funktioniert, das Setzen von FocusManager.FocusedElement = "{Binding ElementName = TxtB}" für den Container hat funktioniert
Grant

1
Funktioniert wie ein Zauber und erfordert keine Namen.
Simon Mattes

1
Hat auch bei mir nicht funktioniert. Vermissen wir etwas?
BrunoLM

1
Hat auch bei mir nicht funktioniert. Vorschlag von Julien Lebosquain Arbeit.
Crypt32

1
Funktioniert auch bei mir nicht. Alle anderen vorgeschlagenen Methoden funktionieren ebenfalls nicht. Dieses Problem muss elementar sein und sollte leicht lösbar sein. Deshalb mögen viele Leute wpf nicht.
IgorStack

6

Ich bin neu in der Verwendung von WPF und habe die obigen Beispiele gelesen. Ich hatte eine ähnliche Erfahrung damit, den Fokus auf ein Textfeld zu legen, indem ich die angegebenen xaml-Codebeispiele verwendete, dh alle oben genannten Beispiele funktionierten nicht.

Ich fand, dass ich den FocusManager.FocusElement im Seitenelement platzieren musste. Ich gehe davon aus, dass dies wahrscheinlich auch funktionieren würde, wenn Sie ein Fenster als übergeordnetes Element verwenden würden. Wie auch immer, hier ist der Code, der für mich funktioniert hat.

 <Page x:Class="NameOfYourClass"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  mc:Ignorable="d"
  Title="Title" 
  Height="720"
  Width="915"
  Background="white"
  Loaded="pgLoaded"
  FocusManager.FocusedElement="{Binding ElementName=NameOfYourTextBox}">

  <!-- Create child elements here. -->

  </Page>

0

Binden Sie das Element, auf das Sie den Fokus richten möchten

FocusManager.FocusedElement= "{Binding ElementName= Comobox1}"

im Raster oder in der Gruppenbox usw.


4
Uhh ja, danke für die gleiche Antwort, die alle anderen gegeben haben ... 4 Jahre später ...
Adam Plocher

4
@AdamPlocher Schön, dass Sie Sulfian dauerhaft vom Stapelüberlauf abhalten. Eine Meldung "Willkommen beim Stapelüberlauf" wäre angemessener gewesen.
Contango

2
@ Contango: "Zuletzt gesehen Nov 11 '14". Er war lange weg, bevor Adam seinen Kommentar gepostet hat :)
Gone Coding

0

FocusManager war nicht in Intellisense und das verwirrte mich ein bisschen. Ich habe gerade das gesamte Attribut eingegeben und es hat funktioniert.

FocusManager.FocusedElement = "{Binding ElementName = MyTextBox}"


Microsoft Visual Studio Enterprise 2015 Version 14.0.23107.0/C#/WPF


0

Der Vollständigkeit halber gibt es auch eine Möglichkeit, dies anhand des dahinter stehenden Codes zu handhaben (z. B. bei Steuerelementen, die aus irgendeinem Grund dynamisch erstellt werden und in XAML nicht vorhanden sind). Fügen Sie dem Loaded-Ereignis des Fensters einen Handler hinzu und verwenden Sie dann die Methode ".Focus ()" des gewünschten Steuerelements. Beispiel für nackte Knochen unten.

public class MyWindow
{
    private VisualCollection controls;
    private TextBox textBox;

    // constructor
    public MyWindow()
    {
        controls = new VisualCollection(this);
        textBox = new TextBox();
        controls.Add(textBox);

        Loaded += window_Loaded;
    }

    private void window_Loaded(object sender, RoutedEventArgs e)
    {
        textBox.Focus();
    }
}

0

Aus dem Experimentieren die Xaml-Lösung

FocusManager.FocusedElement="{Binding ElementName=yourElement}"

scheint am besten zu funktionieren, wenn Sie es im höchsten Element der Fensterhierarchie platzieren (normalerweise Fenster oder das Raster, in dem Sie alles andere platzieren).


0

Verwendung: local:FocusManager.FocusOnLoad="True"

    public class FocusManager
    {
        public static readonly DependencyProperty FocusOnLoad = DependencyProperty.RegisterAttached(
            "FocusOnLoad",
            typeof(bool),
            typeof(FocusManager),
            new UIPropertyMetadata(false, new PropertyChangedCallback(OnValueChanged))
            );

        private static void OnValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            if (!(sender is Control control))
                return;

            if ((bool) e.NewValue == false)
                return;

            control.Loaded += (s, e) => control.Focus();
        }

        public static bool GetFocusOnLoad(DependencyObject d) => (bool) d.GetValue(FocusOnLoad);

        public static void SetFocusOnLoad(DependencyObject d, bool value) => d.SetValue(FocusOnLoad, value);
    }

0

Ich habe eine Textbox in einem Raster in einer DataTemplate, auf die ich den Tastaturfokus setzen möchte, wenn sie sichtbar wird. Das habe ich auch gefunden

<DataTemplate x:Key="DistanceView" DataType="{x:Type vm:ROI}">
    <Grid FocusManager.FocusedElement="{Binding ElementName=tbDistance}">
        <TextBox x:Name="tbDistance" Grid.Column="1" Grid.Row="1" VerticalAlignment="Bottom"/>
    </Grid>
</DataTemplate>

hat bei mir nicht funktioniert.

Wenn ich jedoch Focus () im übergeordneten ContentControl aufrufe

private void ContentControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    if ((sender as ContentControl).IsVisible)
    {
        (sender as ContentControl).Focus();
    }
}

es beginnt zu arbeiten und das Caret ist in der TextBox sichtbar. Ich denke, das FocusScope muss fokussiert werden, damit die FocusManager.FocusedElement-Eigenschaft einen Effekt hat.

Jerry

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.