将插入符号位置设置为多个文本框的末尾



我正在尝试在全部填充文本后,将许多TextBoxes的插入符号一个接一个地设置为文本的末尾。我知道有很多方法可以设置它,但似乎都需要TextBoxFocus。我的问题是,一次全部执行此操作意味着只有最后一个TextBox受到影响。我相信这是因为 UI 只会同时受到影响,因此只应用了一个Focus。有什么解决方法可以一次设置多个插入符号位置吗?

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

您可以像这样将每个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。这意味着矩形不会接收任何坐标。我尝试从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);
}

最新更新