代码之家  ›  专栏  ›  技术社区  ›  deerchao

为WinForms控件添加一个加载事件,就像窗体类一样

  •  5
  • deerchao  · 技术社区  · 15 年前

    是否可以像System.Windows.Forms.Form.Load那样为System.Windows.Forms.Control获取加载事件?

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

    此外,能够为System.Windows.Forms.ToolStripStatusLabel执行同样的操作也很好,因为它实际上不是一个控件,但工作方式与控件类似。

    理想情况下,我可以这样做: control.onload(()=>此处显示剂量;);

    其中,onload是一个扩展方法,在“control”加载时将运行参数操作。

    谢谢!

    3 回复  |  直到 12 年前
        1
  •  4
  •   John Isaiah Carmona    13 年前

    Form.Load 事件由调用 OnLoad 从调用的方法 OnCreateControl 属于的方法 Control 班级。因此,对于表单,调用顺序如下:

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

    我想你可以超越 动态控制 为您的组件添加优化代码。

    希望这有帮助,问候。

        2
  •  5
  •   Hans Passant    15 年前

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

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

    最后但并非最不重要的是,如果代码实际需要创建控件,请确保只执行其中的任何操作。绝大多数init代码可以进入构造函数。如果代码取决于控件的实际位置和大小,则只需要一个加载事件。如果表单因目标计算机上的系统字体或视频DPI设置不同而自行重新进行销售,则可能与设计器值不同。

        3
  •  0
  •   Taryn Frank Pearson    12 年前

    我需要这样的解决方案 TabPage 在一个 TabControl 。我唯一想到的是使用画图事件处理程序。我为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
    }