像Form类一样为Winforms控件添加Load事件

dee*_*hao 5 events controls components onload-event winforms

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

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

另外,能够为System.Windows.Forms.ToolStripStatusLabel做同样的事情会很好,它实际上不是一个Control,但是就像一个.

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

其中OnLoad是一个扩展方法,当"控制""加载"时将运行参数Action.

谢谢!

ser*_*nko 6

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

OnCreateControl start
  OnLoad start
      Form Load event call
  OnLoad finish
OnCreateControl finish
Run Code Online (Sandbox Code Playgroud)

我想您可以覆盖OnCreateControl您的组件并在其中添加优化代码。

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


Han*_*ant 5

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

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

最后但同样重要的是,如果您的代码实际上需要创建控件,请务必执行此操作.绝大多数init代码都可以放在构造函数中.如果您的代码取决于控件的实际位置和大小,则只需要Load事件.如果表单由于目标计算机上的不同系统字体或视频DPI设置而重新缩放,则可能与设计者值不同.