将插入符/光标位置设置为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();