如何取消正在进行的`Refresh()`过程?

时间:2014-03-28 14:28:05

标签: c# .net winforms

我的应用程序绑定了需要重绘屏幕的参数,某些参数导致重绘时间稍长。

我创建了一个界面来处理我的访问器,以便对于需要此参数的参数,我调用NotifyRedrawRequired(),这最终会调用this.Refresh();

我的代码:

public delegate void MyFormDrawRequiredEventHandler(object sender, string callerName);

public MyForm() : Form {
    public MyForm() {
        InitializeComponent();
        this.DoubleBuffered = true;

        this.ResizeRedraw = true;
        this.DrawRequired += MyForm_DrawRequired;
    }

    void MyForm_DrawRequired(object sender, string callerName) { this.Refresh(); }

    [Category("Action")]
    [Description("Fires when a redraw is required by the class.")]
    public event MyFormDrawRequiredEventHandler DrawRequired;

    protected virtual void NotifyDrawRequired([CallerMemberName] String callerName = "")
    {
        if (DrawRequired != null) { DrawRequired(this, callerName); }
    }

    private int blockSpacing;
    public int BlockSpacing
    {
        get { return blockSpacing; }
        set
        {
            if (blockSpacing != value)
            {
                blockSpacing = value;
                NotifyDrawRequired();
            }
        }
    }
    /// Rest of the form code ...
}

避免让Refresh()事件堆积的最佳方法是什么? 取消Refresh()进程是一件简单的事情吗? / p>

1 个答案:

答案 0 :(得分:0)

我花了太长时间才找到一个参考来刷新我的内存名称,但是这不是100%Winforms,出于某种原因,这曾经是针对原始Windows的半标准练习编程API。您可以suspend painting并通过发送WM_SETREDRAW消息重新启动它。

当你这样做时,很大程度上取决于你的应用程序。我曾经使用计时器。在太短的时间内太多,请关闭它们。暂时没有,或者我们正在接近几个电影帧"如果没有更新,请重新开启。

如果Windows无法更新窗口,它会收集Invalidate d矩形以便更新。