web-dev-qa-db-fra.com

Définissez la position du curseur / curseur à la fin de la zone de texte de la valeur de chaîne WPF

J'essaie de définir la position du curseur/curseur sur fin de la valeur de chaîne dans ma zone de texte WPF lorsque j'ouvre ma fenêtre pour la première fois. J'utilise le FocusManager pour définir le focus sur ma zone de texte lorsque ma fenêtre s'ouvre.

Rien ne semble fonctionner. Des idées?

Remarque, j'utilise le modèle MVVM et j'ai inclus uniquement une partie du XAML de mon code.

<Window 
    FocusManager.FocusedElement="{Binding ElementName=NumberOfDigits}"
    Height="400" Width="800">

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <TextBox Grid.Column="0" Grid.Row="0" 
                 x:Name="NumberOfDigits"
                 IsReadOnly="{Binding Path=IsRunning, Mode=TwoWay}"
                 VerticalContentAlignment="Center"
                 Text="{Binding Path=Digits, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
        <Button Grid.Column="0" Grid.Row="1" 
                 Margin="10,0,10,0"
                 IsDefault="True"
                 Content="Start" 
                 Command="{Binding StartCommand}"/>
    </Grid>
 </Window>
65
Zamboni

Vous pouvez définir la position du curseur à l'aide de la propriété CaretIndex d'une TextBox. N'oubliez pas qu'il ne s'agit pas d'un DependencyProperty. Néanmoins, vous pouvez toujours le définir en XAML comme ceci:

<TextBox Text="123" CaretIndex="{x:Static System:Int32.MaxValue}" />

N'oubliez pas de définir la propriété CaretIndexaprèsText sinon cela ne fonctionnera pas. Ainsi, cela ne fonctionnera probablement pas si vous vous liez à Text comme dans votre exemple. Dans ce cas, utilisez simplement du code comme ceci.

NumberOfDigits.CaretIndex = NumberOfDigits.Text.Length;
91
wpfwannabe

Vous pouvez également créer un comportement qui, tout en restant codé, a l'avantage d'être réutilisable.

Exemple d'une classe de comportement simple, utilisant l'événement focus de la zone de texte:

class PutCursorAtEndTextBoxBehavior: Behavior<UIElement>
{
   private TextBox _textBox;

   protected override void OnAttached()
   {
        base.OnAttached();

        _textBox = AssociatedObject as TextBox;

        if (_textBox == null)
        {
            return;
        }
        _textBox.GotFocus += TextBoxGotFocus;
   }

    protected override void OnDetaching()
    {
        if (_textBox == null)
        {
            return;
        }
        _textBox.GotFocus -= TextBoxGotFocus;

        base.OnDetaching();
    }

    private void TextBoxGotFocus(object sender, RoutedEventArgs routedEventArgs)
    {
        _textBox.CaretIndex = _textBox.Text.Length;
    }
}    

Ensuite, dans votre XAML, vous attachez le comportement comme suit:

    <TextBox x:Name="MyTextBox" Text="{Binding Value}">
        <i:Interaction.Behaviors>
            <behaviors:PutCursorAtEndTextBoxBehavior/>
        </i:Interaction.Behaviors>
    </TextBox>
20
Louis

Cela a fonctionné pour moi. J'utilise également le modèle MVVM. Cependant, mon but pour utiliser un MMVM est de rendre possible le test unitaire et de faciliter la mise à jour de mon interface utilisateur (à couplage lâche). Je ne me vois pas tester l'unité de la position du curseur, donc cela ne me dérange pas de recourir au code derrière pour cette tâche simple.

    public ExpeditingLogView()
    {
        InitializeComponent();

        this.Loaded += (sender, args) =>
        {                                
            Description.CaretIndex = Description.Text.Length;
            Description.ScrollToEnd();
            Description.Focus();
        };
    }
4
Michael Ceranski

Si votre zone de texte (WinForms) est multiligne avec une barre de défilement verticale, vous pouvez essayer ceci:

textbox1.Select(textbox1.Text.Length-1, 1);
textbox1.ScrollToCaret();

Remarque: Dans WPF .ScrollToCaret () n'est pas membre de TextBox.

3
molbalga

En cas de multiligne TextBox le réglage du curseur ne suffit pas. Essaye ça:

NumberOfDigits.ScrollToEnd();
1
andreikashin