2

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

1つを除いて、すべて正常に機能します。カスタムデザイナークラスのInitializeメソッドに、ToolStripコントロールを挿入して、デザイン時にフォームを開くたびに、このコントロールが表示および編集できるようにします。問題は、デザイナでフォームを閉じて再度開くたびにInitializeメソッドが呼び出されるため、ToolStripコントロールの新しいインスタンスが作成され、フォームのControlsコレクションに追加されることです。コードにシリアル化されたToolStripコントロールがすでにあるかどうかを確認し、別のコントロールを追加しないようにする方法を探しています。

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

御時間ありがとうございます!:-)

4

1 に答える 1

1

まあ、LoadComplete イベントは正しいポイントです。通常、Loading プロパティをチェックして、読み込み中に 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プロパティを使用して親フォームを取得できます。

于 2009-05-26T09:46:00.307 に答える