Windows窗体UserControl设计时间属性

时间:2010-12-21 13:49:42

标签: c# design-time

我正在努力使用UserControl。我有一个代表寻呼机的UserControl,它有一个以这种方式暴露的Presenter对象属性:

[Browsable(false)]
[DesignSerializationAttribute(DesignSerializationAttribute.Hidden)]    
public object Presenter { get; set; }

代码本身可以工作,因为我可以将控件拖放到Windows From中而无需Visual Studio初始化此属性。 现在,因为在此控件的Load事件中,我调用Presenter的一个方法,在运行时为null ...我已经介绍了这个额外的代码:

public override void OnLoad(...)
{
   if (this.DesignMode)
   {
      base.OnLoad(e);
      return;
   }
   presenter.OnViewReady();
}

现在,每次打开包含此UserControl的Window时,Visual Studio都会修改Windows设计器代码。所以,一旦我打开它,VS问我是否要保存它...当然,如果我向Window添加一个控件,它不会保留更改......一旦我删除了UserControl寻呼机问题消失了...... 我该如何以正确的方式解决这个问题?我只是不希望presenter属性在设计时被初始化,因为它是在运行时注入的......

2 个答案:

答案 0 :(得分:0)

当VS尝试生成设计器代码时,您可能会遇到异常。

将VS的第二个副本附加到设计器,打开Break On Exceptions,看看发生了什么。

答案 1 :(得分:0)

因此,包含UserControl的Windows窗体的Designer抛出异常:

此错误的实例(1)

  1. Infrastructure.BaseModule.MYWindow.Designer.cs行:108列:1隐藏调用堆栈
  2. 在System.ComponentModel.Design.Serialization.CodeDomSerializerBase.Error(IDesignerSerializationManager manager,String exceptionText,String helpLink) 在System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager manager,String name,CodeExpression expression) 在System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager manager,String name,CodeExpression expression) 在System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager manager,CodeStatement statement)