簡體   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