7


2

テキストが追加されたときに自動的に一番下までスクロールしたいFlowDocumentScrollViewerがあります。


コードでは、段落にインラインを追加していますが、テキストが多い場合は、ユーザーに表示させるのではなく、コードを使用して単純にスクロールダウンできるようにしたいと思います。

助言がありますか?

5 Answer


12


試してみてください。

Scroller.ScrollViewer.ScrollToEnd();

「Scroller」はFlowDocumentScrollViewerの名前です。

編集:私はこの答えを少し早く書きすぎました。 FlowDocumentScrollViewerはScrollViewerプロパティを公開しません。 私は実際にFlowDocumentScrollViewerクラスを拡張し、ScrollViewerプロパティを自分で実装しました。 これが実装です。

/// ///プロパティのバッキングストア。 /// private ScrollViewer scrollViewer;

/// /// FlowDocumentScrollViewerコントロールに含まれるスクロールビューアを取得します。/// public Sc​​rollViewer ScrollViewer {get {if(this.scrollViewer == null){DependencyObject obj = this;}

do {if(VisualTreeHelper.GetChildrenCount(obj)> 0)obj = VisualTreeHelper.GetChild(obj as Visual、0);それ以外の場合はnullを返します。 while(!(objはScrollViewer));

ScrollViewerとしてthis.scrollViewer = obj。 }

this.scrollViewerを返します。 }}


9


私は同様の問題に直面しました:私は私のテキストを保持することができ、それを折り返すことができ、それがその親コン​​トロールをいっぱいにしてスクロール可能な_テキストエリア_が欲しいのです。

最初に_TextBlock_を_ScrollViewer_と一緒に使用しようとしましたが、うまくいったと思いますが、何らかの理由で_FlowDocumentScrollViewer_ではなく_FlowDocument_を使用したいと思いました。 この後者はうまくいきませんでした、そして私はただ無意味な戦いを残すことができなかったので私は解決策を見つけようとしました、そしてこれは私がここに来た方法です。 元の質問に対する回答に示されている回避策を適用しようとしましたが、どちらの解決策もうまくいきませんでした(.NET 4.5を使用しています。他のバージョンでも機能しますが、わかりません)。

私は単独で_FlowDocument_を単独で使用しようとしましたが、コントロールには欲しくないUI要素がいくつか含まれています。 それで、私は別の解決策を思いつきました。


そのとおり。 できます! _ScrollViewer.ScrollToBottom()_を呼び出すだけで動作します。 _ScrollViewer_はスクロールを有効にし、_FlowDocumentScrollViewer_は_FlowDocument_からUI要素を削除します。 それが役に立てば幸い!

'' '' '

この方法では、_FlowDocument_がマウスのスクロールホイールを介してスクロールできないため、私の構造に問題があるようです。 ただし、_FlowDocumentScrollViewer_コントロールの_IsHitTestVisible_プロパティを_False_に設定すると解決します。


7


私がFlowDocumentScrollViewerにパブリックな "ScrollViewer"プロパティを見ていないので、ここで与えられる他の答えは少し戸惑います。

私はこのような問題を回避しました。 このメソッドは初期化中にnullを返す可能性があることに注意してください。

public static Sc​​rollViewer FindScrollViewer(このFlowDocumentScrollViewer flowDocumentScrollViewer){if(VisualTreeHelper.GetChildrenCount(flowDocumentScrollViewer)== 0){nullを返します。 }

// Borderは、ScrolldocumentViewerの最初の子の最初の子ですDependencyObject firstChild = VisualTreeHelper.GetChild(flowDocumentScrollViewer、0); if(firstChild == null){nullを返す。 }

デコレータボーダー=デコレータとしてのVisualTreeHelper.GetChild(firstChild、0)。

if(border == null){nullを返す。 }

ScrollViewerとしてborder.Childを返します。 }


1


この質問は7年前に聞かれた、今私は同じ問題を抱えている、そして私は簡単な解決策を見つける。 次のコードは、段落と同じFlowdocumentにSectionを追加し、最後までスクロールします。

private void addSection(Section section){section.Loaded = section_Loaded;} fdoc.Blocks.Add(セクション); }

private void section_Loaded(object sender、RoutedEventArgs e)//最後までスクロールする{var sec = Sectionとしての送信者。 if(sec!= null){sec.BringIntoView(); }}


1


これは非常に遅い答えかもしれませんが、私はこれをする方法を見つけました。

//after your FlowDocumentScrollViewer(for example, x:Name="fdsv") loaded
ScrollViewerとしてScrollViewer sv = fdsv.Template.FindName( "PART_ContentHost"、fdsv)。

sv.ScrollToBottom(); sv.ScrollToTop(); sv.ScrollToVerticalOffset(100);
// etc.
https://msdn.microsoft.com/ja-jp/library/system.windows.controls.primitives.iscrollinfo(v=vs.110).aspx[IScrollInfo]およびhttps://msdn.microsoft.com/jaを確認してください。詳細については、-us / library / system.windows.controls.scrollviewer(v = vs.110).aspx#メソッド[ScrollViewer]を参照してください。

これがお役に立てば幸いです。