【发布时间】: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