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で使用しようとしましたが、うまくいったと思いますが、何らかの理由でFlowDocumentScrollViewerではなくFlowDocumentを使用したいと思いました。この後者はうまくいかず、戦いを放置することができなかったので、解決策を見つけようとしましたが、これが私がここにたどり着いた方法です. 元の質問への回答に示されている回避策を適用しようとしましたが、どちらの解決策もうまくいきませんでした (.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 に答える