FlowDocument
にコンテンツが追加、変更されたときなどを検出したい場合は(できればイベントを通じて)、FlowDocument
を表示しているFlowDocumentScrollViewer
を自動的に最後までスクロールさせたい場合。FlowDocumentの検出と変更スクロール
答えて
FlowDocument
の変更は、テキスト範囲を作成して変更を監視することで検出できます。あなたがScrollViewer
を見つけなければならないので、下にスクロールすることはより困難です。また、パフォーマンスのために、すべての変更ですべてのスクロール計算をやり直す必要はないので、DispatcherOperations
を使用してください。 FindFirstVisualDescendantOfType
は、指定されたの見つけシンプルな深さ優先プレフィックスVisualTreeHelper.GetChildrenCount()
とVisualTreeHelper.GetChild()
を使用してビジュアルツリーの検索や最初のビジュアルを返すです
var range = new TextRange(flowDocument.ContentStart, flowDocument.ContentEnd);
object operation = null;
range.Changed += (obj, e) =>
{
if(operation==null)
operation = Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() =>
{
operation = null;
var scrollViewer = FindFirstVisualDescendantOfType<ScrollViewer>(flowDocument);
scrollViewer.ScrollToBottom();
});
};
:このコードは、トリックを行う必要がありますすべて一緒にそれを置く
タイプ。
FlowDocumentScrollViewer
のテンプレートが変更される可能性があるため、完全性のために私はコードの先頭にscrollViewerを事前計算していません。これが起こらない場合は、このコードはFlowDocumentScrollViewer
に.ApplyTemplate()
を呼び出し、その後、イベントハンドラが登録される前にscrollViewer
を計算することによって高速化することができます。私たちは単にscrollViewer.GetTemplateChild("PART_ContentHost")
を呼び出し、ビジュアルツリーの検索をスキップすることはできません
var range = new TextRange(flowDocument.ContentStart, flowDocument.ContentEnd);
object operation = null;
flowDocument.ApplyTemplate();
var scrollViewer = FindFirstVisualDescendantOfType<ScrollViewer>(flowDocument);
range.Changed += (obj, e) =>
{
if(operation==null)
operation = Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() =>
{
operation = null;
scrollViewer.ScrollToBottom();
});
};
注意GetTemplateChild
が保護されているためです。
リッチテキストボックスを使用して編集していますか?その場合は、the TextChanged
eventをフックしてから、the ScrollToVerticalOffset
methodにthe ViewportHeight
propertyの値を付けてコールするだけです。
いいえ。RichTextBoxではなく、FlowDocumentScrollViewerを使用しています。 –
TextChangedイベントにフックした後、あなたは、単に使用することができます。
// Showing Last Block
YourReader.Document.Blocks.LastBlock.BringIntoView();
// Or.. showing the last Inline
(YourReader.Document.Blocks.LastBlock as Paragraph).Inlines.LastInline.BringIntoView();
しかし、を、このページでのみ FlowDocumentPageViewerに、 ともFlowDocumentReader上を(作品ViewingModes)、FlowDocumentScrollViewerの場合 前述のようにビジュアルツリーを使用する必要があります
public static ScrollViewer FindScroll(Visual visual)
{
if (visual is ScrollViewer)
return visual as ScrollViewer;
ScrollViewer searchChiled = null;
DependencyObject chiled;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
{
chiled = VisualTreeHelper.GetChild(visual, i);
if (chiled is Visual)
searchChiled = FindScroll(chiled as Visual);
if (searchChiled != null)
return searchChiled;
}
return null;
}
ScrollViewer scroller = FindScroll(YourReader as Visual);
if (scroller != null)
(scroller as ScrollViewer).ScrollToBottom();
私はFlowDocumentとFlowDocumentscrollViewerのみを使用しています。上記のBringIntoViewソリューションは私にとって完璧に機能します。私はVisualTreeHelperを必要としませんでした 私のソリューションはDispatcher.Invokeを使って段落を作成し、その段落を変数として保存し、次にDispatcher.Invokeを再度表示して表示することです。 これは最も簡単な方法です。 –
あなたは、内側スクロールビューアを取得するには、次の拡張メソッドを使用することができます。
public static class FlowDocumentScrollViewerExtensions
{
public static ScrollViewer GetScrollViewer(this FlowDocumentScrollViewer element) {
if (element == null) {
throw new ArgumentNullException(nameof(element));
}
return element.Template?.FindName("PART_ContentHost", element) as ScrollViewer;
}
}
また、あなたは(場合にあなたがスクロールしたいスクロール位置にScrollViewerの自分自身をチェックするためにコンテンツを追加する前に、これらの拡張メソッドを使用することができます - スクロール視聴者が例えば端部)にすでにだった場合のみ - :
public static class ScrollViewerExtensions
{
public static bool IsAtHome(this ScrollViewer element) {
if (element == null) {
throw new ArgumentNullException(nameof(element));
}
return element.VerticalOffset <= 0;
}
public static bool IsAtEnd(this ScrollViewer element) {
if (element == null) {
throw new ArgumentNullException(nameof(element));
}
return element.VerticalOffset >= element.ScrollableHeight;
}
}
はその後ちょうど例えばscrollViewer.ScrollToEnd()を呼び出します。
- 1. WPF Flowdocument "ケースの変更"機能
- 2. jQueryスクロール検出
- 3. UIScrollViewスクロールの検出
- 4. 角2:キャンバスと変更の検出
- 5. コンポーネント/サービス、変更の検出とゾーン
- 6. ピッチの検出と変更java
- 7. 検出と素材の変更2
- 8. ライフサイクルフックメソッドのAngular2変更検出
- 9. javascriptソースコード変更の検出
- 10. 変更の検出jQuery
- 11. DOM変更イベントの検出
- 12. Angular2デフォルトの変更検出
- 13. ユーザー変更とjs変更入力値の検出
- 14. recyclerviewの開始スクロールと終了スクロールの検出
- 15. Ember JSのスクロール検出?
- 16. jQuery:ページをスクロールしながら要素の 'クラス'変更を検出します。
- 17. 変数変更のライブ検出
- 18. %変更を検出する
- 19. SAPUI5変更検出メカニズム
- 20. angular2 @入力変更検出
- 21. DIVのHTMLとCSSを検出し、兄弟DIVとスクロールするように変更する
- 22. 角度検出での変更検出の使用方法
- 23. JavaScriptスクロール画像エッジ検出
- 24. WPF:印刷されたFlowDocumentでフォントが変更されない
- 25. GWTのDockLayoutPanelsのサイズ変更とスクロール
- 26. Python 3:Tkinter OptionMenu変更とパスの変数を検出
- 27. ウォッチャーは変化を検出し、変更
- 28. canActivate PromiseブロックまたはObservableブロックの検出変更検出
- 29. EditText:ユーザー入力の変更と負荷データの変更の検出
- 30. FlowDocument - 私は、ヘッダーとリストが含まれてFlowDocument持つ段落
私はFlowDocumentとFlowDocumentScrollViewerのビジュアルツリーコードでこれを必要としませんでした。 Just 2 Invokes、1は文字列の段落を作成して追加し、1はその段落を表示します。 –