Je suis actuellement en train de créer un clavier à l'écran. Je gère le clic du bouton à l'aide des commandes routées. Le problème est que lorsque je clique sur le bouton dans le panneau du clavier, le focus se déplace sur le bouton plutôt que sur la zone de texte. L'exigence stipule qu'un curseur doit toujours apparaître dans la zone de texte pour indiquer la position où le caractère suivant sera inséré. Existe-t-il un moyen de garder le focus sur la zone de texte lorsque le bouton est cliqué.
Pour définir le focus logique sur un contrôle d'entrée
FocusManager.SetFocusedElement(this, textboxJack); // set logical focus
Pour définir le focus du clavier sur un contrôle d'entrée
Keyboard.Focus(textboxJill); // set keyboard focus
Pour connaître la différence entre le focus logique et le focus clavier
Présentation des entrées - Focus sur MSDN
Obtenez la référence du contrôle spécifique (dans ce cas, TextBox). Après avoir cliqué, dans la méthode Button_Click, collez ceci:
Dispatcher.BeginInvoke((ThreadStart)delegate
{
control.Focus();
});
J'aime ces questions faites-moi mes devoirs; "l'exigence stipule" ... inestimable. Pour ceux qui trouvent cela via Google, l'astuce pour déplacer progressivement le curseur dans un WPF TextBox est d'utiliser la propriété SelectioNStart.
private void Button_Click(object sender, RoutedEventArgs e)
{
textBox.Focus();
textBox.SelectionStart = textName.Text.Length;
}
Textbox.Focus();
cela se concentrera sur la zone de texte
La façon dont j'ai résolu ce problème était de définir focusable=false
à tous les boutons/commandes du clavier. De cette façon, vous ne perdez pas de concentration sur le contrôle actuel.
J'ai dû l'utiliser pour obtenir le résultat souhaité
FocusManager.SetFocusedElement(this, UserNameautoCompleteBox);
Key key = Key.Enter; // Key to send
var target = Keyboard.FocusedElement; // Target element
RoutedEvent routedEvent = Keyboard.KeyDownEvent; // Event to send
target.RaiseEvent(
new KeyEventArgs(
Keyboard.PrimaryDevice,
PresentationSource.FromVisual(UserNameautoCompleteBox),
0,
key) { RoutedEvent = routedEvent }
);
Votre problème peut être résolu en utilisant une portée de mise au point distincte pour votre "clavier". Appliquez simplement la propriété suivante au contrôle qui contient tous vos boutons, puis ils se trouveront dans une étendue de focus distincte et ne se verront pas attribuer le focus lorsqu'ils seront cliqués
FocusManager.IsFocusScope="True"
Je voulais faire la même chose, mais rien ne semblait fonctionner pour moi. J'avais vraiment besoin d'une réponse qui fonctionnait uniquement en XAML car je travaille avec MVVM.
J'ai finalement trouvé cet exemple: http://spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/
et l'a modifié comme suit:
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 grille:
<Grid Style="{StaticResource FocusTextBox}" />