2009-02-18 3 views
6

Ich habe einen FlowDocumentScrollViewer Ich möchte automatisch nach unten scrollen , wenn Text hinzugefügt wird.Scrollen Sie einen WPF FlowDocumentScrollViewer von Code?

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

In Code, den ich hinzufügen Inlines auf den Absatz, aber wenn es zu viel Text ist, würde ich gerne in der Lage sein, unter Verwendung von Code einfach nach unten scrollen, anstatt den Benutzer, die dies zu tun.

Irgendwelche Vorschläge?

Antwort

6

Die anderen gegebenen Antworten hier sind etwas verwirrend, da ich keine öffentliche „Scroll“ Eigenschaft auf dem Flowdocumentscrollviewer sehen.

Ich habe das Problem so gehackt. Beachten Sie, dass diese Methode bei der Initialisierung null zurückgeben kann:

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; 
} 
+0

Danke für den Hinweis auf den Fehler in meiner Antwort. Ich habe es korrigiert. –

+0

Beachten Sie, dass die FindScrollViewer-Methode derzeit nicht funktioniert, die Version in John Myczeks Antwort jedoch. – Niall

+0

Mit "derzeit" meinst du in WPF 4.0? Wenn man es erneut betrachtet, könnte es zerbrechlich und zerbrochen sein, wenn man Änderungen an den genauen Steuerelementen zwischen dem FlowDocumentScrollViewer und dem ScrollViewer, die durch Version oder Styling verursacht werden, vornimmt, so dass ein einfacherer und ignoranterer Ansatz besser sein könnte. – Anthony

12

Versuch:

Scroller.ScrollViewer.ScrollToEnd(); 

Wo "Scroller" der Name Ihres Flowdocumentscrollviewer ist.

EDIT: Ich schrieb diese Antwort ein wenig zu schnell. FlowDocumentScrollViewer stellt keine ScrollViewer-Eigenschaft zur Verfügung. Ich hatte tatsächlich die FlowDocumentScrollViewer-Klasse erweitert und die ScrollViewer-Eigenschaft selbst implementiert. Hier ist die Umsetzung:

/// <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; 
    } 
    } 
+0

Ich bekomme und Fehler das kann nicht in ein DependencyObject konvertiert werden – Paparazzi

9

ich ein ähnliches Problem konfrontiert habe: Ich habe einen Textbereich wollte, die meinen Text halten konnte, in der Lage ist, es zu wickeln, es füllt seine Eltern Kontrolle und ist scrollbar.

Zuerst habe ich versucht, eine TextBlock- mit einem Scroll zu verwenden und ich denke, es funktioniert, aber aus irgendeinem Grund habe ich wollte ein Flowdocument statt mit einem Flowdocumentscrollviewer verwenden. Letzteres hat nicht geklappt und ich konnte den Kampf nicht ungeduldig lassen, also habe ich versucht, Lösungen zu finden und so bin ich hierher gekommen. Ich habe versucht, die Problemumgehungen in den Antworten auf die ursprüngliche Frage anzuwenden, aber keine Lösungen für mich ausgearbeitet (ich verwende .NET 4.5, vielleicht funktioniert es in anderen Versionen, aber ich weiß nicht darüber).

Ich habe versucht, eine einzelne FlowDocument von sich aus auch, aber das Steuerelement enthält einige UI-Elemente, die ich nicht wollte. Also habe ich eine andere Lösung gefunden.

<ScrollViewer VerticalScrollBarVisibility="Auto"> 
    <FlowDocumentScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"> 
     <FlowDocument> 

Das stimmt. Es klappt! Rufen Sie an ScrollViewer.ScrollToBottom() funktioniert einfach! Die ScrollViewer ermöglicht Scrollen und FlowDocumentScrollViewer entfernt die UI-Elemente aus der FlowDocument. Ich hoffe es hilft!


Anscheinend hatte meine Konstruktion einen Fehler, weil auf diese Weise die Flowdocument über eine Maus des Scroll-Rad nicht scrollbaren ist.Setzen Sie jedoch die FlowDocumentScrollViewer Steuerelement IsHitTestVisible -Eigenschaft zu False löst dies.

0

Diese Frage wurde vor 7 Jahren gestellt, jetzt habe ich das gleiche Problem, und ich finde eine einfache Lösung. Der folgende Code fügt FlowDocument einen Abschnitt hinzu, der zu Paragraph hinzugefügt wird, und blättert dann bis zum Ende.

0

Dies kann eine sehr späte Antwort sein, aber ich habe einen Weg gefunden, dies zu tun.

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

prüfen IScrollInfo und ScrollViewer für weitere Einzelheiten.

Ich hoffe, das hilft Ihnen.

Verwandte Themen