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

TabPage内の a には、このようなソリューションが必要でした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
}
于 2012-01-11T21:33:01.180 に答える