84 votes

Placez la position du curseur à la fin de la valeur de la chaîne de caractères de la boîte de texte WPF.

J'essaie de définir la position du curseur sur l'écran de l'ordinateur. fin de la valeur de la 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. Avez-vous des idées ?

Notez que j'utilise le modèle MVVM, et que je n'ai inclus qu'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>

114voto

wpfwannabe Points 4671

Vous pouvez définir la position du curseur en utilisant CaretIndex d'un TextBox . Veuillez garder à l'esprit qu'il ne s'agit pas d'un DependencyProperty . Néanmoins, vous pouvez toujours le définir dans XAML comme ceci :

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

N'oubliez pas de régler CaretIndex après Text sinon cela ne fonctionnera pas. Ainsi, cela ne fonctionnera probablement pas si vous liez à la propriété Text comme dans votre exemple. Dans ce cas, utilisez simplement le code-behind comme ceci.

NumberOfDigits.CaretIndex = NumberOfDigits.Text.Length;

26voto

Louis Points 110

Vous pouvez également créer un comportement qui, tout en restant du code caché, 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>

5voto

Ça a marché pour moi. J'utilise également le modèle MVVM. Cependant, si j'utilise un MVVM, c'est pour rendre les tests unitaires possibles et pour faciliter la mise à jour de mon interface utilisateur (couplage lâche). Je ne me vois pas tester unitairement 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();
        };
    }

3voto

andreikashin Points 445

En cas d'utilisation de plusieurs lignes TextBox Le réglage du curseur ne suffit pas. Essayez ceci :

NumberOfDigits.ScrollToEnd();

3voto

Dans WPF, si la ligne est assez longue, il est important de faire défiler jusqu'à la fin de la ligne. J'utilise donc les lignes suivantes :

text_Box.Text = text;
text_Box.CaretIndex = text.Length;
text_Box.ScrollToHorizontalOffset(double.MaxValue);
// or you can use this - for me works also
// text_Box.ScrollToHorizontalOffset(text_Box.GetRectFromCharacterIndex(openFileDialog.FileName.Length).Right);

mais lisez cet avertissement (pour moi, c'est bon - probablement déjà corrigé) : La TextBox ScrollToHorizontalOffset ne défile pas lorsque le texte est suffisamment long.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X