C#Onpaint没有开火

时间:2011-10-28 18:14:53

标签: c# winforms

我有这段代码:

    private void HandleGUI()
    {
        if (_currentForm == null)
        {
            navigationSideBar1.Visible = false;
            pnlToolbar.Visible = false;

            return;
        }

        if (_currentForm.ShowNavigationBar)
        {
            HandleNavigationButton(_currentForm);
        }

        btnSave.Visible = _currentForm.ShowSaveButton;
        btnClose.Visible = _currentForm.ShowCloseButton;
        btnSave.Paint += new PaintEventHandler(btnSave_Paint);
        navigationSideBar1.Visible = _currentForm.ShowNavigationBar;
        pnlToolbar.Visible = _currentForm.ShowToolBar;

        btnSave.Refresh();
        btnSave.Invalidate();
    }

我在保存按钮(btnSave)的onpaint事件上注册,但是即使我调用Refresh或Invalidate也不会触发此事件。这怎么可能?

编辑: 这是saave按钮类的样子:

public class SaveButton : ButtonX
{
    public SaveButton()
    {
        this.Image = Properties.Resources.Save;
        this.Text = "Opslaan";
        this.Size = new Size(108, 39);

    }
}

4 个答案:

答案 0 :(得分:2)

尝试将常规DevComponent按钮(即不是它的子类)添加到测试表单中,看看它是否会触发其Paint事件。他们可能已经暴露了一个Paint事件(因此它们的界面与常规按钮的界面匹配)但实际上没有实现它。

答案 1 :(得分:2)

userpaint设置为true会触发onpaint事件

this.SetStyle(ControlStyles.UserPaint, true);

答案 2 :(得分:1)

来自MSDN

  

调用Invalidate方法不会强制执行同步绘制;要强制执行同步绘制,请在调用Invalidate方法后调用Update方法。

因此,您需要更新通话。现在,刷新只是无效更新子项+更新,所以从理论上讲,你已经得到了解决。我可以想到的是,除非确实需要,否则Windows不会调用Paint,即当窗体显示在UI上或写入图形设备时(不可见窗口的“屏幕截图”)。这些都是这种情况吗?

答案 3 :(得分:0)

似乎您没有在SaveButton组件的构造函数中调用基类构造函数。

public class SaveButton : ButtonX
{
    public SaveButton() : base()
...