如何保持ScrollViewer的位置?

时间:2016-05-19 17:33:45

标签: c# wpf

我有一个文本框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);

2 个答案:

答案 0 :(得分:1)

TextBox.TextChanged Event

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接口和相关类来在每次添加文本时手动设置滚动位置。