簡體   English   中英

Avalonedit如何使Line Transformers無效

[英]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

這適用於ElementGeneratorsLineTransformers

對於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM