2010-10-29 183 views
5

這似乎是這樣一個簡單的事情,但我不能讓它工作。滾動到一行的末尾WPF TextBox

我有一個單行文本框,有很多文字。我想要發生的是,只要文本框收到焦點,它就會滾動到文本的末尾,以便它進入視圖並且光標最後準備好接受新文本。

在文本框的GotFocus事件中,我調用textBox.ScrollToEnd()。它看起來像所有這些將光標移動到文本框的末尾,但實際上並沒有將末端放到視圖中。

我錯過了什麼?

回答

12

你應該能夠使用這些成員做到這一點:


編輯:不知道爲什麼ScrollToEnd不工作...無論如何,此代碼有效:

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

我試圖在GotFocus中調用textBox.ScrollToEnd(),但它沒有將字符串的末尾放到焦點上。設置CaretIndex只會移動插入位置,但不會將該位置放在視圖中。因此,如果我的文本框中包含的文字多於可以合適的文字,並且我想在焦點聚焦時滾動到結尾,那麼我該怎麼做?我在我的小示例中只有一個文本框,Width =「80」,在GotFocus方法中,我嘗試了TextBoxBase.ScrollToEnd,TextBox.CaretIndex以及兩者的組合,以滾動到長字符串的末尾。如果你有它的工作,你可以發佈樣本? – Flack 2010-10-30 03:31:22

+0

@Flack,看我更新的答案 – 2010-10-30 15:46:43

+0

謝謝。這樣做效果更好,但是它取決於當您離開文本框時插入符的最後位置,它有點奇怪。它看起來像是與文本框的水平偏移量有關。我改變了最後一行來讀取textBox.ScrollToHorizo​​ntalOffset(Math.Max(rect.Right,textBox.Horizo​​ntalOffset));現在看起來工作正常。謝謝您的幫助。 – Flack 2010-11-01 21:06:28

2

這對我有效。

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

確實如此 - 從代碼設置脫字符屬性不會影響視圖;脫字符可以在可見部分之外。

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會在插入右邊的文本框邊框後,跟隨插入符號。

+2

這適用於我,而其他方法都無效。 – 2016-07-22 07:40:57