10

我有一个 FlowDocumentScrollViewer 我想在添加文本时自动滚动到底部。

<FlowDocumentScrollViewer Name="Scroller">
 <FlowDocument Foreground="White" Name="docDebug" FontFamily="Terminal">
  <Paragraph Name="paragraphDebug"/>
 </FlowDocument>
</FlowDocumentScrollViewer>

在代码中,我将内联添加到段落中,但是当文本过多时,我希望能够使用代码简单地向下滚动,而不是让用户这样做。

有什么建议么?

4

5 回答 5

15

尝试:

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;
     }
  }
于 2009-02-18T14:42:24.037 回答
11

我遇到过类似的问题:我想要一个文本区域,它可以保存我的文本,能够包装它,它填充它的父控件并且是可滚动的。

首先,我尝试将TextBlockScrollViewer一起使用,我认为它有效,但出于某种原因,我想使用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可以解决此问题。

于 2013-03-03T12:39:51.853 回答
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;
}
于 2009-03-29T14:32:18.263 回答
2

这个问题是7年前提出的,现在我也遇到了同样的问题,我找到了一个简单的解决方案。以下代码向 Flowdocument 添加一个与段落相同的部分,然后滚动到末尾。

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();
    }
}
于 2016-08-15T09:06:55.147 回答
2

这可能是一个非常晚的答案,但我已经找到了一种方法来做到这一点。

//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.

检查IScrollInfoScrollViewer了解详细信息。

我希望这可以帮助你。

于 2017-06-17T13:03:20.853 回答