【问题标题】:WPF Scroll To End of FlowDocumentWPF 滚动到 FlowDocument 的末尾
【发布时间】:2020-12-09 21:45:08
【问题描述】:

我在将 FlowDocument 包装在 FlowDocumentScrollViewer 中以在其数据更改时滚动到末尾时遇到问题。

这是我的 XAML 代码

<core:CustomFlowDocumentScrollViewer x:Name="ScrollViewer" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
    <FlowDocumentScrollViewer.Document>
        <FlowDocument PagePadding="0">
            <Paragraph Name="Paragraph"></Paragraph>
        </FlowDocument>
    </FlowDocumentScrollViewer.Document>
</core:CustomFlowDocumentScrollViewer>

core:CustomFlowDocumentScrollViewer 实现了以下 sn-p https://stackoverflow.com/a/561319/13567181,这样我以后可以调用ScrollToBottom()

在我的代码隐藏中,我正在清除 Paragraph 并向其添加新行

private void PopulateFlowDocument(IEnumerable<LoggingEvent> list)
{
    Paragraph.Inlines.Clear();

    foreach (var loggingEvent in list)
    {
        var parsedRun = FormatLoggingEvent(loggingEvent);
        Paragraph.Inlines.Add(parsedRun);
        Paragraph.Inlines.Add(Environment.NewLine);
    }
}

一旦PopulateFlowDocument 完成,我调用ScrollToEnd - 控件执行某种程度的滚动,但不能可靠地工作。我的数据源总是返回 5000 行,但滚动视图只滚动到 ~3750 行(有时更多,有时更少)。

FlowDocument 是否在内部异步工作???

方法 2

除了 SO 上可用的解决方案之外,我还尝试了来自 MSDN forum 的以下建议。

void paragraph_Loaded(object sender, RoutedEventArgs e)
{
     Paragraph paragraph = (Paragraph)sender;
     paragraph.Loaded -= paragraph_Loaded;
     paragraph.BringIntoView();
} 

与上面一样,Loaded 事件会提前触发,因此滚动无法可靠地工作。

我正在寻找的是整个文档已更新时的事件/通知,以便我可以可靠地滚动到其最底部。

【问题讨论】:

    标签: c# wpf wpf-controls flowdocument flowdocumentscrollviewer


    【解决方案1】:

    我最终使用调度程序实现了我想要的。我借鉴了here的想法

    Dispatcher.Invoke(new Action(() =>
    {
        SearchResultTextBox.ScrollToEnd();
    }), DispatcherPriority.ContextIdle, null);           
    

    FlowDocument 似乎也在使用调度程序,因此滚动需要足够低的优先级,以便在实际文档修改之后安排它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多