2009-05-26 10 views
2

DocumentDesignerから継承するカスタムデザイナークラスを実装しました。 .NET Frameworkの標準のFormクラスはFormDocumentDesignerクラス(DocumentDesignerも継承しています)を使用しますが、このクラスは内部であるため、継承してその動作をカスタマイズすることはできませんリフレクタを使用してこのクラスのロジックをコピーし、それは私のカスタムデザイナークラス(私のフォームのデフォルトのデザイン時の動作が標準フォームに準拠するように)です。.NET Windowsフォームの問題のカスタムデザイナークラス

私のカスタムデザイナークラスのInitializeメソッドでは、設計時にフォームが開かれるたびにこのコントロールが表示され、編集可能になるように、ToolStripコントロールを挿入したいと考えています。問題は、DesignerStartコントロールの新しいインスタンスを作成してフォームのControlsコレクションに追加するたびに、デザイナーでフォームを閉じて再度開くたびに、Initializeメソッドが呼び出されることです。私は、既にコード内で直列化されたToolStripコントロールがあるかどうかをチェックし、別のコントロールを追加しないようにする方法を探しています。

これまで、IDesignerHostのLoadCompleteイベントを使用して、フォームのControlsコレクションにToolStripがあるかどうかを調べることができました。しかし、より良いアイデアをいただければ幸いです。

ありがとうございました! :-)

答えて

1

まあ、LoadCompleteイベントが正しいポイントです。私は通常、Loadプロパティをチェックして、ロード中にInitializeが起きているのか、ロード後に呼び出されたのかをチェックします。

IDesignerHost _host; 
Form _form; 

public override void Initialize(System.ComponentModel.IComponent component) 
{ 
    _form = component as Form; 
    _host = (IDesignerHost)this.GetService(typeof(IDesignerHost)); 
    if (_host != null) 
    {  
    if (_host.Loading) 
    { 
    _host.LoadComplete += new EventHandler(_host_LoadComplete); 
    } 
    else 
    { 
    initializeForm(); 
    } 
    } 
} 

void _host_LoadComplete(object sender, EventArgs e) 
{ 
    _host.LoadComplete -= new EventHandler(_host_LoadComplete); 
    initializeForm(); 
} 

void initializeForm() 
{ 
    if (_form!= null) 
    { 
     ... 
    } 
} 

もう1つの方法は、FormDesignerを再作成する代わりに、フォームにドロップしてコンポーネントのデザイナーを作成することができるコンポーネントを作成することです。 コンポーネントデザイナーから_host.RootComponentプロパティを使用して親フォームを取得できます。

関連する問題