我想在FlowDocument
中檢測(最好通過事件)任何內容何時添加,更改等,以及何時會導致FlowDocumentScrollViewer
顯示FlowDocument
自動滾動到結尾。檢測FlowDocument更改和滾動
回答
通過創建文本範圍並監視變化,您可以檢測FlowDocument
中的更改。滾動到底部更困難,因爲您必須找到ScrollViewer
。此外,對於性能,您不希望重做所有滾動計算,因此您應該使用DispatcherOperations
。
全部放在一起,這個代碼應該做的伎倆:
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();
});
};
其中FindFirstVisualDescendantOfType
是一個簡單的深度優先前綴搜索使用VisualTreeHelper.GetChildrenCount()
和VisualTreeHelper.GetChild()
可視化樹,並返回第一視覺找到指定的類型。
請注意,對於完整的通用性,我不會預先計算代碼頂部的scrollViewer,因爲FlowDocumentScrollViewer
的模板可以更改。如果這不會發生,這個代碼可以通過在FlowDocumentScrollViewer
調用.ApplyTemplate()
,然後計算scrollViewer
事件處理程序在註冊前可以加快:
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();
});
};
請注意,我們不能簡單地調用scrollViewer.GetTemplateChild("PART_ContentHost")
並跳過視覺樹搜索因爲GetTemplateChild
受保護。
您是否使用RichTextBox進行編輯?如果是這樣,你應該可以掛鉤the TextChanged
event,然後撥打電話the ScrollToVerticalOffset
method,其值爲the ViewportHeight
property。
否使用FlowDocumentScrollViewer,而不是RichTextBox。 – 2009-11-02 12:25:25
掛鉤的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放入視圖中。 這似乎是最簡單的方法。 – 2015-02-25 18:32:38
您可以使用下面的擴展方法來獲得內滾動查看器:
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本身(要滾動的情況下才使用這些擴展方法 - only-如果滾動觀衆已經在最後爲例):
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. QListView檢測滾動更改
- 2. 檢測面板中的自動滾動位置值更改
- 3. UIScrollView滾動檢測
- 4. 檢測UITableView滾動
- 5. jQuery滾動檢測
- 6. 的iOS滾動型檢測滾動
- 7. Android - 比例和滾動檢測器
- 8. 滾輪滾動 - 滾動更改圖片
- 9. 檢測垂直滾動和滾動條寬度並將寬度更改應用於主體
- 10. 檢測更改jQuery
- 11. 更改滾動條
- 12. 更改CSS滾動
- 13. 檢測左滾動JavaScript
- 14. 使用scrollTop檢測滾動
- 15. 水平檢測滾動uitableviewCell
- 16. JQuery檢測滾動底部
- 17. jQuery - 檢測滾動量
- 18. MonoTouch - 檢測UITableView滾動
- 19. Libgdx檢測水平滾動
- 20. 檢測滾動事件(pdfnet)
- 21. Angular 2自動更改檢測週期
- 22. 檢測活動何時更改
- 23. 檢測動態段中的更改
- 24. 域驅動開發:檢測更改(.NET)
- 25. 檢測方向和更改類
- 26. 如何檢測碎片更改和更改方向
- 27. 檢測/監聽服務啓動和停止狀態更改
- 28. 檢測是用戶已在iOS上滾動,然後更改視圖的顏色
- 29. 檢測SubmitChanges()前的更改()
- 30. jQuery檢測輸入更改
我不需要任何與FlowDocument和FlowDocumentScrollViewer可視化樹代碼。只需2次調用,1就可以創建並添加字符串中的段落,並將該段落添加到視圖中。 – 2015-02-25 18:33:43