6

有没有办法像 System.Windows.Forms.Form.Load 一样为 System.Windows.Forms.Control 获取 Load 事件?

我想在控件首次显示之前运行一些初始化代码。

此外,如果 System.Windows.Forms.ToolStripStatusLabel 实际上不是一个控件,但可以像一个控件一样工作,那将是很好的。

理想情况下,我可以这样做: control.OnLoad(() => { dosomething here; });

其中 OnLoad 是一个扩展方法,它会在“控制”“加载”时运行参数 Action。

谢谢!

4

3 回答 3

8

Form.Load事件由从属于该类的方法OnLoad调用的方法调用。因此,对于表单,调用顺序如下:OnCreateControlControl

OnCreateControl start
  OnLoad start
      Form Load event call
  OnLoad finish
OnCreateControl finish

我想你可以覆盖OnCreateControl你的组件并在那里添加你的优化代码。

希望这会有所帮助,问候。

于 2009-12-10T04:10:28.083 回答
5

对于控件,您可以覆盖 OnControlCreated 或 OnHandleCreated。如果需要重新创建控制窗口,后者可以触发多次。如果您的代码影响窗口本身,请务必使用它。换句话说,如果你做任何需要 Handle 属性的事情。

ToolStripItem 派生控件的合适选择很少。我建议覆盖 SetVisibleCore() 或 OnAvailableChanged() 或 AvailableChanged 事件。它们在 ToolStripItem 的 Visible 属性更改时运行。请注意它可能会触发多次,请保留一个 bool 字段来跟踪您的初始化代码已经运行。

最后但并非最不重要的一点是,请确保仅在您的代码确实需要创建控件时才执行此操作。绝大多数初始化代码都可以放在构造函数中。如果您的代码取决于控件的实际位置和大小,您只需要一个 Load 事件。如果由于目标计算机上不同的系统字体或视频 DPI 设置而导致表单重新缩放,这可能与设计器值不同。

于 2009-12-10T18:06:36.680 回答
0

我需要一个像这样的解决方案。我想出的唯一一件事就是使用绘制事件处理程序TabPageTabControl我为 Paint 添加了事件处理程序,并在第一行中删除了事件处理程序,然后执行更多初始化代码。这仅在您没有任何自定义绘画时才有效。或者,如果您确实需要进行自定义绘画,您可以添加一个标志以检查每次执行绘画。

//Paint only runs once    
private void tabPage1_Paint(object sender, PaintEventArgs e)
{
    tabPage1.Paint -= tabPage1_Paint;    
    //Do initialization here    
}

/////////////////////////////////////////////////////////////////////////////////

//Paint always runs

private bool IsFirstPaint = true;

private void tabPage1_Paint(object sender, PaintEventArgs e)    
{    
    if(IsFirstPaint)
    {
        IsFirstPaint = false;    
        //Do initialization here
    }    
    //Do custom painting here
}
于 2012-01-11T21:33:01.180 回答