我有一个文本框Log
,问题是当我附加文本,并且用户在滚动的中间或其他位置滚动时,当附加新文本时,ScrollViewer返回到顶部。如何修复用户位置?
这是我的控制:
<TextBox
TextWrapping="Wrap"
AcceptsReturn="True"
Height="240"
IsReadOnly="True"
x:Name="txtLog"
HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Auto"
ScrollViewer.CanContentScroll="True"
/>
以下是我追加文字的方式:
txtLog.AppendText(Environment.NewLine);
txtLog.AppendText(text);
答案 0 :(得分:1)
TextBox.VerticalOffset Property
我认为你可以使用TextBox类的上述两个成员来实现你的目标。
https://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.textboxbase.extentheight(v=vs.110).aspx (需要更多代表发布3个链接,pff ...大声笑)
使用(上面的链接)ExtentHeight,您还可以检查最大滚动位置。
遗憾的是,我不知道你是否需要在进行更改之前存储ScrollPosition,或者在更改Text期间是否调用了Event TextChanged(意味着在EventHandler中的对象中有文本原始文件并且在离开新文本之后)
干杯
答案 1 :(得分:0)
你做这件事的方式是......尴尬。您基本上使用的是一个巨大的文本框,由于各种原因这种文本框效率很低。我将您的实现更改为您添加字符串的ListView或VirutulaizingStackPanel。这样做的好处是,如果使用虚拟化,可以默认使用您正在寻找的行为,并提高内存效率。
如果你绝对不能这样做,你可以使用UIAtuomationProvider和UIAutomationTypes程序集中的IScrollProvider接口和相关类来在每次添加文本时手动设置滚动位置。