Установите позицию курсора / курсора в конец строкового значения WPF textbox - PullRequest
64 голосов
/ 22 мая 2010

Я пытаюсь установить позицию курсора / курсора на end значения строки в моем текстовом поле WPF при первом открытии окна.Я использую FocusManager, чтобы установить фокус на моем текстовом поле, когда мое окно открывается.

Кажется, ничего не работает.Любые идеи?

Обратите внимание, я использую шаблон MVVM, и я включил только часть XAML из моего кода.

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

Ответы [ 5 ]

91 голосов
/ 23 мая 2010

Вы можете установить позицию каретки, используя CaretIndex свойство TextBox.Пожалуйста, имейте в виду, что это не DependencyProperty.Тем не менее, вы все равно можете установить его в XAML следующим образом:

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

Пожалуйста, не забудьте установить CaretIndex после свойства Text, иначе оно не будет работать.Таким образом, это, вероятно, не сработает, если вы свяжетесь с Text, как в вашем примере.В этом случае просто используйте код-ап, как это.

NumberOfDigits.CaretIndex = NumberOfDigits.Text.Length;
20 голосов
/ 22 августа 2013

Вы также можете создать Поведение, которое, хотя и остается за кодом, имеет преимущество в том, что его можно использовать повторно.

Пример простого класса поведения с использованием события focus текстового поля:

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

Затем в вашем XAML вы прикрепляете поведение следующим образом:

    <TextBox x:Name="MyTextBox" Text="{Binding Value}">
        <i:Interaction.Behaviors>
            <behaviors:PutCursorAtEndTextBoxBehavior/>
        </i:Interaction.Behaviors>
    </TextBox>
4 голосов
/ 09 июня 2017

Это сработало для меня. Я также использую шаблон MVVM. Однако моя цель использования MMVM состоит в том, чтобы сделать возможным модульное тестирование и упростить обновление моего пользовательского интерфейса (слабосвязанного). Я не вижу, чтобы юнит тестировал положение курсора, поэтому я не против прибегнуть к коду для этой простой задачи.

    public ExpeditingLogView()
    {
        InitializeComponent();

        this.Loaded += (sender, args) =>
        {                                
            Description.CaretIndex = Description.Text.Length;
            Description.ScrollToEnd();
            Description.Focus();
        };
    }
3 голосов
/ 27 мая 2016

Если ваше текстовое поле (WinForms) является многострочным с вертикальной полосой прокрутки, вы можете попробовать это:

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

Примечание. В WPF .ScrollToCaret () не является членом TextBox.

1 голос
/ 26 сентября 2016

В случае многострочного TextBox установки курсора недостаточно. Попробуйте это:

NumberOfDigits.ScrollToEnd();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...