2017-02-11 94 views

回答

2

您可以从flowdocumentscrollviewer访问scrollviewer。下面是例子

private void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     var scrollViewer = FindScrollViewer(flowDocumentScrollViewer); 
     scrollViewer.ScrollToBottom(); 
    } 

    public static ScrollViewer FindScrollViewer(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; 
    } 
+0

嘛,肯定有效。这是否是标准做法,或者您通常不想滚动到flowdocumentscrollviewer的底部? – PPFY

+0

这是一种没有暴露的功能的实用方法。我没有看到使用它的任何问题。 –

1

或者您可以使用所提供的答案here,并搜索的ScrollViewer:

public static void ScrollToEnd(FlowDocumentScrollViewer fdsv) 
{ 
    ScrollViewer sc = FindVisualChildren<ScrollViewer>(fdsv).First() as ScrollViewer; 
    if (sc != null) 
     sc.ScrollToEnd(); 
} 


public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
{ 
    if (depObj != null) 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
      if (child != null && child is T) 
      { 
       yield return (T)child; 
      } 

      foreach (T childOfChild in FindVisualChildren<T>(child)) 
      { 
       yield return childOfChild; 
      } 
     } 
    } 
}