当前位置:  开发笔记 > 编程语言 > 正文

从代码中滚动WPF FlowDocumentScrollViewer?

如何解决《从代码中滚动WPFFlowDocumentScrollViewer?》经验,为你挑选了3个好方法。

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


 
  
 

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

有什么建议?



1> John Myczek..:

尝试:

Scroller.ScrollViewer.ScrollToEnd();

其中"Scroller"是FlowDocumentScrollViewer的名称.

编辑:我写的这个答案有点太快了.FlowDocumentScrollViewer不公开ScrollViewer属性.我实际上扩展了FlowDocumentScrollViewer类并自己实现了ScrollViewer属性.这是实施:

  /// 
  /// Backing store for the  property.
  /// 
  private ScrollViewer scrollViewer;

  /// 
  /// Gets the scroll viewer contained within the FlowDocumentScrollViewer control
  /// 
  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;
     }
  }



2> Kohányi Róbe..:

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

首先,我尝试使用带有ScrollViewerTextBlock,我认为它有效,但出于某种原因,我想使用FlowDocument而不是FlowDocumentScrollViewer.后者不起作用,我只是无法放弃战斗,所以我试图找到解决方案,这就是我到这里的方式.我已经尝试应用原始问题的答案中提供的解决方法,但是我找不到任何解决方案(我使用的是.NET 4.5,也许它适用于其他版本,但我不知道这一点).

我也试过单独使用一个FlowDocument,但是控件包含了一些我不想要的UI元素.所以,我提出了另一个解决方案.

  
    
      

那就对了.有用!调用ScrollViewer.ScrollToBottom()就可以了!所述的ScrollViewer使得能够滚动和FlowDocumentScrollViewer将删除的UI元素的FlowDocument.希望能帮助到你!


显然我的构造有一个缺陷,因为这样FlowDocument不能通过鼠标的滚轮滚动.但是,将FlowDocumentScrollViewer控件的IsHitTestVisible属性设置为False可以解决此问题.



3> Anthony..:

这里给出的其他答案有点令人费解,因为我没有在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;
}

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有