web-dev-qa-db-fra.com

Focus du curseur sur la zone de texte dans WPF / C #

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

19
deepak

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

35
Gishu

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();
            });
8
mashet

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;
}
5
Josh F.
Textbox.Focus();

cela se concentrera sur la zone de texte

3
gokul

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.

2
Jonas Stawski

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 }
);
1
Brendan Botond

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"
1
Xiaosu

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}" />
0
Anya Hope