我添加了一个从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();
答案 0 :(得分:14)
文本视图维护生成的可视线的缓存。强制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);
答案 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));