【问题标题】:Windows Form UserControl design time propertiesWindows 窗体 UserControl 设计时属性
【发布时间】:2011-05-28 20:20:30
【问题描述】:

我正在努力使用 UserControl。我有一个代表 Pager 的 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 的窗口时,Visual Studio 都会修改 Windows 设计器代码。所以,一旦我打开它,VS就问我是否要保存它......当然,如果我向窗口添加一个控件,它不会保留更改......只要我删除UserControl Pager 问题消失了... 我应该如何以正确的方式解决这个问题?我只是不希望在设计时初始化演示者属性,因为它是在运行时注入的......

【问题讨论】:

  • 如果您不在设计模式下,您是否知道您没有调用base.OnLoad?这是故意的吗?
  • 设计器文件有什么变化?
  • 是的,别担心,代码调用 base.OnLoad(e) 如果不是在设计时,我跳过这里向您展示仅在运行时调用演示者,但是问题是不同的......
  • 没有什么真正改变,但我所做的改变在我保存时被吹走了......
  • 属性的第二个属性是废话。请务必从您的源代码中复制/粘贴。

标签: c# design-time


【解决方案1】:

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

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

【讨论】:

  • 所以问题出在那个属性上......如果我删除它一切都很好,除了 VS 初始化 Presenter 属性,我不想要那个......
  • 所以异常是由包含 UserControl 的 Windows 窗体的设计器抛出的:
【解决方案2】:

所以异常是由包含 UserControl 的 Windows 窗体的设计器引发的:

此错误的实例(一)

  1. Infrastructure.BaseModule.MYWindow.Designer.cs 行:108 列:1 隐藏调用堆栈

在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.Error(IDesignerSerializationManager manager, String exceptionText, String helpLink) 在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager 管理器,字符串名称,CodeExpression 表达式) 在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager 管理器,字符串名称,CodeExpression 表达式) 在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager manager, CodeStatement 语句)

【讨论】:

  • 我发现了错误:我将控件命名为Library...PagerView.PagerView,其中PagerView 既是命名空间又是控件的名称。在 VS Designer 中,这无法完成,因为它将尝试解析命名空间而不是控件名称。
猜你喜欢
  • 2011-09-03
  • 2011-09-26
  • 2013-08-12
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
相关资源
最近更新 更多