[英]Avalonedit How to invalidate Line Transformers
我添加了一個從DocumentColorizingTransformer派生到TextEditor的LineTransformerClass:
TxtEditCodeViewer.TextArea.TextView.LineTransformers.Add(new ColorizeAvalonEdit());
是否有任何編程方式在Linetransformer上調用失效?
我很容易認為,因為它被添加到textview,以下應該工作:
TxtEditCodeViewer.TextArea.TextView.InvalidateVisual();
TxtEditCodeViewer.TextArea.TextView.InvalidateArrange();
TxtEditCodeViewer.TextArea.TextView.InvalidateMeasure();
但他們沒有。 為了以防萬一,我也嘗試了以下內容:
//TxtEditCodeViewer.TextArea.TextView.InvalidateVisual();
//TxtEditCodeViewer.TextArea.TextView.InvalidateArrange();
//TxtEditCodeViewer.TextArea.TextView.InvalidateMeasure();
//TxtEditCodeViewer.InvalidateVisual();
//TxtEditCodeViewer.InvalidateArrange();
//TxtEditCodeViewer.InvalidateMeasure();
//TxtEditCodeViewer.TextArea.InvalidateArrange();
//TxtEditCodeViewer.TextArea.InvalidateMeasure();
//TxtEditCodeViewer.TextArea.InvalidateVisual();
文本視圖維護生成的可視線的緩存。 強制WPF重新繪制控件只會使其重新使用緩存中的結果,並且不會再次調用您的線路轉換器。
您可以使用TextView.Redraw
方法使緩存的可視行無效:
textEditor.TextArea.TextView.Redraw(segment); // invalidate portion of document
textEditor.TextArea.TextView.Redraw(); // invalidate whole document
這適用於ElementGenerators
和LineTransformers
。
對於BackgroundRenderers
,沒有必要使視線無效。 相反,只需告訴文本視圖使背景渲染器所屬的圖層無效:
textEditor.TextArea.TextView.InvalidateLayer(this.Layer);
我有同樣的問題。 我設置了一些文字的背景顏色......
所以我必須在設置背景之前做一個變通方法(背景保存在緩存中):
if (Txtpreview.TextArea.TextView.LineTransformers.Count > 2)
{
Txtpreview.TextArea.TextView.LineTransformers.RemoveAt(1); // removes selection highlight
}
Txtpreview.TextArea.TextView.LineTransformers.Add(new MarkSameWord(Txtpreview.SelectedText));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.