【问题标题】:How to keep ScrollViewer position?如何保持 ScrollViewer 的位置?
【发布时间】:2016-05-19 17:33:45
【问题描述】:

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

【问题讨论】:

标签: c# wpf


【解决方案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,或者在更改文本期间是否调用了事件 TextChanged(意味着在 EventHandler 内的对象中以及在离开新文本之后将文本原件) .

干杯

【讨论】:

  • 顺便说一句,在覆盖 TextInput 事件(SCROLLVIEWER)的 OnTextInput 处理程序时,它甚至可能更简单。但你必须自己测试,对不起。获取控件更改的其他可能事件是 SourceUpdated 和 TargetUpdated,但我猜对于这个任务,后面的事件是矫枉过正。
【解决方案2】:

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

如果您绝对不能这样做,您可以使用 IScrollProvider 接口和 UIAtuomationProvider 和 UIAutomationTypes 程序集中的关联类来手动设置每次添加文本时的滚动位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 2021-03-13
    相关资源
    最近更新 更多