我有一个FlowDocumentScrollViewer我想自动滚动到底部 添加文字时。
<FlowDocumentScrollViewer Name="Scroller">
<FlowDocument Foreground="White" Name="docDebug" FontFamily="Terminal">
<Paragraph Name="paragraphDebug"/>
</FlowDocument>
</FlowDocumentScrollViewer>
在代码中我向段落添加了内联,但是当我需要很多文本时 喜欢能够简单地使用代码向下滚动而不是让用户这样做。
有什么建议吗?
答案 0 :(得分:13)
尝试:
Scroller.ScrollViewer.ScrollToEnd();
其中“Scroller”是FlowDocumentScrollViewer的名称。
编辑:我写的这个答案有点太快了。 FlowDocumentScrollViewer不公开ScrollViewer属性。我实际上扩展了FlowDocumentScrollViewer类并自己实现了ScrollViewer属性。以下是实施:
/// <summary>
/// Backing store for the <see cref="ScrollViewer"/> property.
/// </summary>
private ScrollViewer scrollViewer;
/// <summary>
/// Gets the scroll viewer contained within the FlowDocumentScrollViewer control
/// </summary>
public ScrollViewer ScrollViewer
{
get
{
if (this.scrollViewer == null)
{
DependencyObject obj = this;
do
{
if (VisualTreeHelper.GetChildrenCount(obj) > 0)
obj = VisualTreeHelper.GetChild(obj as Visual, 0);
else
return null;
}
while (!(obj is ScrollViewer));
this.scrollViewer = obj as ScrollViewer;
}
return this.scrollViewer;
}
}
答案 1 :(得分:9)
我遇到了类似的问题:我想要一个文本区域,它可以保存我的文本,能够包装它,它填充它的父控件并且可以滚动。
首先,我尝试将 TextBlock 与 ScrollViewer 一起使用,我认为它有效,但出于某种原因,我想使用 FlowDocument 而不是 FlowDocumentScrollViewer 。后者不起作用,我只是无法放弃战斗,所以我试图找到解决方案,这就是我到这里的方式。我已经尝试应用原始问题的答案中提供的解决方法,但是我找不到任何解决方案(我使用的是.NET 4.5,也许它适用于其他版本,但我不知道这一点)。
我也尝试过使用单个 FlowDocument ,但控件包含一些我不想要的UI元素。所以,我提出了另一个解决方案。
<ScrollViewer VerticalScrollBarVisibility="Auto">
<FlowDocumentScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden">
<FlowDocument>
没错。有用!调用 ScrollViewer.ScrollToBottom()就可以了! ScrollViewer 启用滚动, FlowDocumentScrollViewer 从 FlowDocument 中删除UI元素。希望它有所帮助!
显然我的构造有一个缺陷,因为这样 FlowDocument 不能通过鼠标的滚轮滚动。但是,将 FlowDocumentScrollViewer 控件的 IsHitTestVisible 属性设置为 False 可解决此问题。
答案 2 :(得分:8)
这里给出的其他答案有点令人费解,因为我在FlowDocumentScrollViewer上看不到任何公共“ScrollViewer”属性。
我这样解决了这个问题。请注意,此方法在初始化期间可以返回null:
public static ScrollViewer FindScrollViewer(this FlowDocumentScrollViewer flowDocumentScrollViewer)
{
if (VisualTreeHelper.GetChildrenCount(flowDocumentScrollViewer) == 0)
{
return null;
}
// Border is the first child of first child of a ScrolldocumentViewer
DependencyObject firstChild = VisualTreeHelper.GetChild(flowDocumentScrollViewer, 0);
if (firstChild == null)
{
return null;
}
Decorator border = VisualTreeHelper.GetChild(firstChild, 0) as Decorator;
if (border == null)
{
return null;
}
return border.Child as ScrollViewer;
}
答案 3 :(得分:1)
7年前问过这个问题,现在我遇到了同样的问题,我找到了一个简单的解决方案。以下代码将一个Section添加到Flowdocument,它与Paragraph相同,然后滚动到结尾。
private void addSection(Section section)
{
section.Loaded += section_Loaded;
fdoc.Blocks.Add(section);
}
private void section_Loaded(object sender, RoutedEventArgs e)//scroll to end
{
var sec = sender as Section;
if (sec != null)
{
sec.BringIntoView();
}
}
答案 4 :(得分:1)
这可能是一个非常晚的答案,但我找到了一种方法。
//after your FlowDocumentScrollViewer(for example, x:Name="fdsv") loaded
ScrollViewer sv = fdsv.Template.FindName("PART_ContentHost", fdsv) as ScrollViewer;
sv.ScrollToBottom();
sv.ScrollToTop();
sv.ScrollToVerticalOffset(100);
// etc.
查看IScrollInfo和ScrollViewer了解详情。
我希望这会对你有所帮助。