web-dev-qa-db-fra.com

Définir le focus sur une zone de texte dans xaml wpf

Malgré certains messages sur ce forum et d'autres, je ne trouve rien qui me dise comment définir le focus sur un TextBox.

J'ai un userControl avec beaucoup d'étiquettes et textBoxes. Lorsque le formulaire est chargé, je souhaite que la zone de texte ait le focus.

J'ai mis le tabIndex mais cela n'a pas semblé fonctionner.

Aucune suggestion?

86
user9969

Vous pouvez utiliser la propriété jointe FocusManager.FocusedElement à cette fin. Voici un morceau de code qui définit le focus sur TxtB par défaut.

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

Vous pouvez également utiliser TxtB.Focus() dans votre code-behind si vous ne voulez pas le faire dans XAML.

167

Vous pouvez appliquer cette propriété directement sur la zone de texte:

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

J'utilise pour la première fois WPF et en lisant les exemples ci-dessus, j'ai eu une expérience similaire en essayant de définir le focus sur une zone de texte à l'aide des exemples de code xaml donnés, c'est-à-dire que tous les exemples ci-dessus ne fonctionnaient pas.

J'ai constaté que je devais placer FocusManager.FocusElement dans l'élément de page. Je suppose que cela fonctionnerait probablement aussi si vous utilisiez une fenêtre comme élément parent. Quoi qu'il en soit, voici le code qui a fonctionné pour moi.

 <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>
5
Joseph Mawer

De faire des expériences, la solution xaml

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

semble fonctionner mieux lorsque vous le placez dans l'élément le plus élevé de la hiérarchie des fenêtres (généralement Window ou la grille dans laquelle vous placez le reste)

0
Tan Jing Yuan

lier l'élément que vous voulez pointer le focus en tant que 

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

en grille ou groupbox, etc. 

0
Sufian Bashir

FocusManager n'était pas dans l'intellisense et cela m'a un peu dérouté. Je viens de taper l'attribut entier et cela a fonctionné.

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


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

0
icernos

Pour être complet, il existe également un moyen de gérer cela à partir de code arrière (par exemple, dans le cas de contrôles qui, pour une raison quelconque, sont créés dynamiquement et n'existent pas en XAML). Associez un gestionnaire à l'événement Loaded de la fenêtre, puis utilisez la méthode ".Focus ()" du contrôle souhaité. Exemple nu-os ci-dessous.

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
Robert N

Dans mon cas, les réponses fournies n'ont pas fonctionné. Quelque part dans le code après le InitializeComponent();

Je devais ajouter

MyTextBox.Focus(); et ça marche.

0
nPcomp