开发者

Scrolling to the end of a single line WPF TextBox

This seems like such a simple thing but I just can't get it to work.

I have a single line text box that has a lot of text. What I want to happen is that whenever the text box receives focus, it scrolls to the end of the text so that it comes into view and the curso开发者_运维知识库r is at the end ready to accept new text.

In the text box's GotFocus event I call textBox.ScrollToEnd(). It looks like all this does is move the cursor to the end of the text box but not actually bring the end into view.

What am I missing?


You should be able to do it using these members:

  • TextBoxBase.ScrollToEnd
  • TextBox.CaretIndex

EDIT: not sure why ScrollToEnd isn't working... Anyway, this code works:

textBox.CaretIndex = textBox.Text.Length;
var rect = textBox.GetRectFromCharacterIndex(textBox.CaretIndex);
textBox.ScrollToHorizontalOffset(rect.Right);


It is true - setting the caret property from code doesn't affect the view; and the caret can go outside the visible part.

kb_target_box.Focus(); // just for sure
Rect rect = kb_target_box.GetRectFromCharacterIndex(kb_target_box.CaretIndex);
kb_target_box.ScrollToHorizontalOffset(Math.Max((kb_target_box.HorizontalOffset + rect.Left - (kb_target_box.ActualWidth - 40)), 0.0));

h-scroll will follow the caret after it comes closer than 40 to the right TextBox border.


This worked for me.

textBox.CaretIndex = txt.Text.Length;  
textBox.ScrollToEnd();


In my case, my textbox was inside a scrollviewer and I had to call ScrollToEnd() for scrollviewer instead textbox.

XAML

<ScrollViewer x:Name="scrollviewer">
        <TextBox TextBoxBase.TextChanged="TextChanged"/>
</ScrollViewer>

CODE

private void TextChanged(object sender, TextChangedEventArgs e)
{
    scrollviewer.ScrollToEnd();
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜