少なくとも 2 つの異なる方法があります。
1 つ目の方法は、設計時に Site を使用してコンテナーを追跡することです (Site は実行時に呼び出されません)。設計時に ContainerControl プロパティを保存するだけで機能するため、実行時に使用できます。フレームワークの一部のコンポーネントのプロパティ ブラウザで確認できます。
private ContainerControl _containerControl;
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public ContainerControl ContainerControl
{
get { return _containerControl; }
set
{
_containerControl = value;
if (DesignMode || _containerControl == null)
return;
if (_containerControl is Form)
((Form) _containerControl).Load += (sender, args) => { Load(); };
else if (_containerControl is UserControl)
((UserControl)_containerControl).Load += (sender, args) => { Load(); };
else
System.Diagnostics.Debug.WriteLine("Unknown container type. Cannot setup initialization.");
}
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Browsable(false)]
public override ISite Site
{
get { return base.Site; }
set
{
base.Site = value;
if (value == null)
return;
IDesignerHost host = value.GetService(typeof(IDesignerHost)) as IDesignerHost;
if (host == null)
return;
IComponent componentHost = host.RootComponent;
if (componentHost is ContainerControl)
ContainerControl = componentHost as ContainerControl;
}
}
private void Load()
{
}
2 番目の方法は、コンポーネントに ISupportInitialize を実装することです。この場合、設計時に Visual Studio (2013) は、コンポーネントで ISupportInitialize メソッド (BeginInit および EndInit) を呼び出すコードを生成します。