2009-08-28 8 views

Répondre

99

En XAML:

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

Je préfère cette approche aux autres ci-dessus car elle reste en ligne avec MVVM. –

+1

L'élément focalisé est en lecture seule. Comment pouvez-vous définir dans xaml? Je l'ai utilisé et cela n'a pas fonctionné WPFKK

+0

@ user841612, vérifiez le lien suivant et vérifiez l'assembly et l'espace de noms https://msdn.microsoft.com/en-us/library/system.windows.input.focusmanager.focusedelement%28v=vs.110%29. aspx – usefulBee

43

essayer FocusManager.SetFocusedElement

FocusManager.SetFocusedElement(parentElement, txtCompanyID) 
+4

Et si l'élément que vous voulez définir est * l'élément parent o.O? –

+7

FocusManager.SetFocusedElement (FocusManager.GetFocusScope (parentElement), parentElement); – Philter

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

msdn:

sur le bureau tout Il ne peut y avoir qu'un seul élément qui a le focus du clavier. Dans WPF, l'élément qui a le clavier focus aura IsKeyboardFocused défini sur true.

Vous pouvez rompre après la ligne de définition et vérifier la valeur de la propriété IsKeyboardFocused. Vérifiez également si vous atteignez vraiment cette ligne ou peut-être que vous définissez un autre élément pour obtenir le focus après cela.

15

Essayez ceci: MyTextBox.Focus ();

+0

C'est la réponse la plus élégante et il n'est pas nécessaire de spécifier le parent. Merci pour cela, cela fonctionne très bien pour moi! – dbeachy1

7

Rien de tout cela a fonctionné pour moi comme je l'utilisais une grille plutôt que d'un StackPanel.

j'ai finalement trouvé cet exemple: http://spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/

et modifia à ceci:

Dans la section 'Ressources':

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

Dans ma définition de la grille:

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

Cela a fonctionné pour moi aussi. Le reste n'était pas. Merci pour le lien, c'était très intéressant. Aussi intéressant qu'une chose si simple puisse être si compliquée. – TravisWhidden

+2

La réponse ci-dessus fonctionne bien, que le conteneur soit un Gird ou un StackPanel. Puisque la structure de votre grille n'est pas claire, il est difficile de dire ce qui pourrait avoir mal tourné. Bien de voir des alternatives bien. – usefulBee

+1

Pour moi, c'est aussi le seul à fonctionner correctement. Belle façon. – OregonGhost

19

Personne n'a expliqué jusqu'ici pourquoi Le code dans la question ne fonctionne pas. Ma conjecture est que le code a été placé dans le constructeur de la fenêtre. Mais pour le moment, il est trop tôt pour se concentrer. Cela doit être fait une fois que la fenêtre est prête pour l'interaction. Le meilleur endroit pour le code est l'événement Loaded:

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

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

RÉPONSE LA PLUS UTILE DANS CE FIL ENTIER – Airhead

Questions connexes