C# 在VS10.NET表单中获取自定义控件的IDesignerHost时出现问题
根据,我正试图在设计阶段实现表单的IDesignerHost:C# 在VS10.NET表单中获取自定义控件的IDesignerHost时出现问题,c#,visual-studio,C#,Visual Studio,根据,我正试图在设计阶段实现表单的IDesignerHost: private static Form _findForm; protected override void OnCreateControl() { if (_findForm == null) { _findForm = FindForm(); } if (_findForm == null) { throw new Exception("FindForm() returns null.");
private static Form _findForm;
protected override void OnCreateControl()
{
if (_findForm == null) { _findForm = FindForm(); }
if (_findForm == null) { throw new Exception("FindForm() returns null."); }
// NullReference
//IDesignerHost dh = (IDesignerHost)_findForm.Site.GetService(typeof(IDesignerHost));
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
Console.WriteLine(dh == null); // true
// ...
}
但正如你看到的,我找不到裁判。
我是否需要“:IDesigner”类,或者OnCreateControl
调用是否提前获取有效引用
更新:
关于评论中的链接:
public override ISite Site
{
get { return base.Site; }
set
{
Console.WriteLine("Site set"); // Never happens
base.Site = value;
if (value == null) { return; }
}
}
及
我还尝试在初始化所有内容后处理事件。似乎没有什么有用的
那我怎么才能得到理想的职位呢 最终更新: 公认的解决方案是完全相反和错误的:
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)
{
IComponent componentHost = host.RootComponent;
if (componentHost is ContainerControl) { ContainerControl = componentHost as ContainerControl; }
}
}
}
它应该是这样的getter:
private IDesignerHost _host;
public override ISite Site
{
get
{
if (base.Site != null)
{
IDesignerHost host = (IDesignerHost)GetService(typeof(IDesignerHost));
if (host != null) { _host = host; }
}
return base.Site;
}
set { base.Site = value; }
}
正如我发现的,getter被触发,直到它最终能够创建一个有效的引用
base.Site //null
base.Site //null
base.Site //null
base.Site //null
base.Site //...
base.Site //finally got a reference - time to grab it! ;)
也许您可以尝试覆盖站点属性。这里是。不,站点也是空的。请参阅更新。
base.Site //null
base.Site //null
base.Site //null
base.Site //null
base.Site //...
base.Site //finally got a reference - time to grab it! ;)