将插入符/光标位置设置为string值WPF文本框的末尾

我试图设置插入/光标位置到我的WPF文本框中的string值的结尾 ,当我第一次打开我的窗口。 当我的窗口打开时,我使用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> 

您可以使用TextBox CaretIndex属性设置插入位置。 请记住,这不是一个DependencyProperty 。 不过,你仍然可以像这样在XAML中设置它:

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

请记住 Text属性后面设置CaretIndex 否则不起作用。 因此,如果你像在你的例子中绑定到Text它可能不会工作。 在这种情况下,只需使用这样的代码隐藏。

 NumberOfDigits.CaretIndex = NumberOfDigits.Text.Length; 

您也可以创build一个行为,虽然仍然是代码隐藏,但具有可重用的优点。

使用文本框的焦点事件的简单行为类的示例:

 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> 

如果你的文本框(WinForms)是多行垂直滚动条,你可以试试这个:

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

注意:在WPF中.ScrollToCaret()不是TextBox的成员。

这对我有效。 我也使用MVVM模式。 不过,我使用MMVM的目的是使unit testing成为可能,并且更容易更新我的UI(松耦合)。 我没有看到自己unit testing光标的位置,所以我不介意使用这个简单任务的代码。

  public ExpeditingLogView() { InitializeComponent(); this.Loaded += (sender, args) => { Description.CaretIndex = Description.Text.Length; Description.ScrollToEnd(); Description.Focus(); }; } 

如果多行TextBox设置光标不够用。 尝试这个:

 NumberOfDigits.ScrollToEnd(); 
Interesting Posts