将插入位置设置为多个文本框的结尾

时间:2017-07-06 09:35:17

标签: c# wpf

在尝试填充文本之后,我试图将一些TextBoxes的插入符号一个接一个地设置到文本的末尾。我了解有多种方法可以设置此项,但似乎所有方法都要求TextBox位于Focus。我的问题是,一次性完成此操作意味着只有最后一个TextBox受到影响。我相信这是因为UI只会同时受到影响,因此只应用了一个Focus。任何解决方法一次设置多个插入位置?

        txtImagesFolder.Select(txtImagesFolder.Text.Length, 0);
        txtImagesFolder.Focus();

        txtTextFolder.Select(txtTextFolder.Text.Length, 0);
        txtTextFolder.Focus();

1 个答案:

答案 0 :(得分:1)

您可以像这样向右滚动每个TextBox

txtImagesFolder.CaretIndex = txtImagesFolder.Text.Length - 1;
var rect = t1.GetRectFromCharacterIndex(txtImagesFolder.CaretIndex);
txtImagesFolder.ScrollToHorizontalOffset(rect.Right);

创建一个方法并为每个TextBox调用它:

private void Button_Click(object sender, RoutedEventArgs e)
{
    ScrollToRight(txtImagesFolder);
    ScrollToRight(txtTextFolder);
}

private void ScrollToRight(TextBox textBox)
{
    textBox.CaretIndex = textBox.Text.Length - 1;
    var rect = textBox.GetRectFromCharacterIndex(textBox.CaretIndex);
    textBox.ScrollToHorizontalOffset(rect.Right);
}
  

这似乎对我有用。然而,我遇到的一个问题就是在我调用我的ScrollToRights之前,我正在拆除一个包含它们的StackPanel。这意味着rect不接收任何坐标。我尝试从StackPanel的IsVisibleChanged事件中调用它,但这当然也发生在UI更新之前。有关解决方法的任何想法吗?

使用调度程序:

private void Button_Click(object sender, RoutedEventArgs e)
{
    sp.Visibility = Visibility.Visible;

    Dispatcher.BeginInvoke(new Action(() =>
    {
        ScrollToRight(txtImagesFolder);
        ScrollToRight(txtTextFolder);
    }), System.Windows.Threading.DispatcherPriority.Background);
}