[英]How do I only repaint a special area?
我的英语水平很差,因为我不是母语人士。
我写了一个编辑器,它具有像 Highlight 一样的视觉效果。 编辑器具有用于表示视觉效果的 DrawingControl,如下代码所示。
public class HighlightTextBox : TextBox
{
private DrawingControl renderCanvas;
}
public class DrawingControl : FrameworkElement
{
private VisualCollection visuals;
private DrawingVisual visual;
public DrawingControl()
{
visual = new DrawingVisual();
visuals = new VisualCollection(this);
visuals.Add(visual);
}
public DrawingContext GetContext()
{
return visual.RenderOpen();
}
protected override int VisualChildrenCount
{
get { return visuals.Count; }
}
protected override Visual GetVisualChild(int index)
{
if (index < 0 || index >= visuals.Count)
throw new ArgumentOutOfRangeException();
return visuals[index];
}
}
如果用户在编辑器上输入字符,则调用 TextChanged 事件。 之后,通过调用 InvalidateVisual function 调用 OnRender function。
TextChanged(s,e)
{
InvalidateVisual();
}
然后使用 DrawingControl 中的 DrawingContext 绘制所有具有视觉效果的文本。
protected override void OnRender(DrawingContext drawingContext)
{
if (this.bSingleLineChanged)
{
this.SingleLineChangedRender(drawingContext);
this.bSingleLineChanged = false;
return;
}
else
this.AllRender(drawingContext);
}
private void AllRender(DrawingContext drawingContext)
{
// Calculate drawing position, texts, etc...
var dc = this.renderCanvas.GetContext();
// Here draw texts
dc.Close();
base.OnRender(drawingContext);
}
结果,当所有文本都被重新绘制时,绘制过程成功,但这种方式需要很多时间。 为了缩短绘图时间,我尝试只重新绘制更新的部分。 零件绘制过程在 SingleLineChangedRender function 中定义。 function 的逻辑也与 AllRender function 类似。
现在我要解释一个问题。 我计算了一个更新的部分,并在 SingleLineChangedRender function 中编写了逻辑。 但是当在 SingleLineChangedRender function 中调用 GetContext function 时,所有绘制的上下文都会被删除。
private void SingleLineChangedRender(DrawingContext drawingContext)
{
// I think that here all drawn contexts are erased.
var dc = this.renderCanvas.GetContext();
// Here draw texts
dc.Close();
base.OnRender(drawingContext);
}
我只想重新绘制更新的部分,但我不能这样做,因为当调用 GetContext function 时,所有上下文都会被删除。
我想征求你的意见来解决这个问题。
感谢您的阅读。
我听从了您的建议,并通过更新 DrawingControl class 解决了这个问题。
我将 TextViewer class 更新为 DrawingContext 的容器。
结果,class 形成了以下。
public class TextViewer : FrameworkElement
{
// For highlighting of the selected line.
private DrawingVisual selectionLineAppearance = new DrawingVisual();
// For highlighting tokens of the lines.
private VisualCollection lines;
protected override int VisualChildrenCount
{
// selectionLineAppearance + lines
get { return 1+lines.Count; }
}
protected override Visual GetVisualChild(int index)
{
if (index < 0 || index >= VisualChildrenCount)
throw new ArgumentOutOfRangeException();
if (index == 0) return this.selectionLineAppearance;
return lines[index-1];
}
// logices
...
}
现在,编辑器只能重绘更新的部分。 加法可以绘制所选线的外观。
感谢您的意见。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.