Avalonedit如何使Line Transformers无效

时间:2012-08-20 06:56:01

标签: c# .net wpf avalonedit invalidation

我添加了一个从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();

2 个答案:

答案 0 :(得分:14)

文本视图维护生成的可视线的缓存。强制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);

答案 1 :(得分:0)

我遇到了同样的问题。 我设置了一些文字的背景颜色......

所以我必须在设置背景之前做一个解决方法(背景保存在缓存中):

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));