6

我已将派生自 DocumentColorizingTransformer 的 LineTransformerClass 添加到 TextEditor:

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

2 回答 2

15

文本视图维护生成的视觉线的缓存。强制 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);
于 2012-08-20T15:37:24.613 回答
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));
于 2014-04-22T10:31:38.363 回答