C# 如何保持ScrollViewer的位置? 我有一个文本框,作为日志>代码>,问题是当我追加文本,用户在中间滚动,或者滚动的其他位置,当新的文本被追加时,ScLoVIEVER返回到顶部。如何固定到用户位置

C# 如何保持ScrollViewer的位置? 我有一个文本框,作为日志>代码>,问题是当我追加文本,用户在中间滚动,或者滚动的其他位置,当新的文本被追加时,ScLoVIEVER返回到顶部。如何固定到用户位置,c#,wpf,C#,Wpf,这是我的控制: <TextBox TextWrapping="Wrap" AcceptsReturn="True" Height="240" IsReadOnly="True" x:Name="txtLog" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto" ScrollViewer.CanContentScrol

这是我的控制:

<TextBox 
    TextWrapping="Wrap" 
    AcceptsReturn="True" 
    Height="240" 
    IsReadOnly="True" 
    x:Name="txtLog"
    HorizontalScrollBarVisibility="Disabled" 
    VerticalScrollBarVisibility="Auto"
    ScrollViewer.CanContentScroll="True"
    />

你这样做…很尴尬。实际上,您使用的是一个巨大的文本框,由于各种原因,它效率低下。我会将您的实现更改为添加字符串的ListView或VirutulaizingStackPanel。这样做的好处是,默认情况下具有所需的行为,如果使用虚拟化,则内存效率更高

如果您绝对无法做到这一点,则可以使用IScrollProvider接口以及UIAtuomationProvider和UIAutomationTypes程序集中的关联类,在每次添加文本时手动设置滚动位置

我认为您可以使用TextBox类的上述两个成员来实现您的目标

https://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.textboxbase.extentheight(v=vs.110).aspx (需要更多代表发布3个链接,pff…lol)

使用(上面的链接)扩展灯,您还可以检查最大滚动位置

不幸的是,我不知道在进行更改之前是否需要存储ScrollPosition,或者在更改文本期间是否调用了EventTextChanged事件(这意味着在EventHandler内的对象中保留原始文本并保留新文本之后)


Cheers

可能重复@Rowbear阻止SCROLLVIEWER的代码太多赏金接收答案只有几行控制滚动位置的代码:)顺便说一句,重写(SCROLLVIEWER的)TextInput事件的OnTestInput处理程序时可能更简单。但你得自己测试一下,抱歉。获取控件更改的其他可能事件有SourceUpdated和TargetUpdated,但我想对于这个任务,后面的这些事件是多余的。
txtLog.AppendText(Environment.NewLine);
txtLog.AppendText(text);