繁体   English   中英

如何只重绘特殊区域?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM