我有这段代码:
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);
}
}
答案 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()
...