3

当我尝试在 Visual Studio 2008 中为 Windows CE 应用程序创建继承表单时,我收到错误消息:

无法为此文件显示设计器,因为无法设计其中的任何类。设计人员检查了文件中的以下类: TestForm --- 无法加载基类“InheritanceTest.BaseForm”。确保已引用程序集并且已构建所有项目。

Visual Studio 2008,版本 9.0.30729.1 SP
Microsoft .NET Framework 版本 3.5 SP1。

我可以在不编写任何代码的情况下解决问题,也无需以任何方式自定义表单。BaseForm 是在同一个项目中还是在单独的类库中都没有区别。项目编译正常,问题在于在设计器中查看继承的表单。它发生在我的两台计算机上。我正在使用 C#。

解决问题的过程:
文件 - 新项目 - Windows C# - 智能设备 - CeInheritanceTest (.Net Framework 3.5)
目标平台 - Windows CE - 设备应用程序
添加 - 新项目 - Visual C# 项目 - Windows 窗体 - Windows 窗体 - “BaseForm”
Build Solution
Add – New Item – Visual C# Items – Windows Forms – Inherited Form – "TestForm"
– 从 BaseForm 继承

如果我对普通的桌面应用程序做同样的事情,表单继承就没有问题。

通过在网上搜索这个问题,看起来其他人正在使用紧凑框架获得表单继承,所以我一定遗漏了一些东西。

我没有编写或修改任何代码,所以基类不是抽象的,我没有使用 PInvoke。

有什么建议么?

4

2 回答 2

2

出现此问题的原因是 .NET CF 控件的设计器元数据不会自动创建并编译到您的项目中,以降低设备的二进制大小。您必须手动创建所谓的“设计时属性文件”。

在包含您的基本表单的项目中,添加一个新项目。从已安装模板列表中选择“设计时属性文件”。它将具有 .xmta 扩展名。如果你打开它,你会发现它是一个 xml 文件。您可以将大量选项添加到此文件中,以控制您的自定义控件/表单的设计和序列化方式,您可以查找有关此的更多信息,但如果您只想能够设计您的表单只需添加一个属性:DesktopCompatible=True。

这是一个示例:

<Classes xmlns="http://schemas.microsoft.com/VisualStudio/2004/03/SmartDevices/XMTA.xsd">
  <Class Name="CeInheritanceTest.BaseForm">    
    <DesktopCompatible>true</DesktopCompatible>
 </Class>
</Classes>

确保“类”节点中的名称是基本表单的完全限定名称。编译您的项目,您应该能够在设计器中打开它。您还会注意到项目的输出文件夹中有一个带有 .asmmeta.dll 扩展名的新程序集。这是包含设计人员对具有可设计组件的库的支持的程序集。尝试设计 .NET CF 组件时,Visual Studio 会自动加载它。

于 2012-06-27T12:42:15.037 回答
1

我也努力寻找这个问题的解决方案,我终于解决了。除了将 true 添加到基本表单之外,您还应该在基本表单的 Load 方法中添加以下内容:

if (this.Site != null && this.Site.DesignMode == true)
{
  // Design Mode
}
else
{
  // Run-time
}

这会阻止设计器执行 Load 事件处理程序中的代码。还有一件事,如果在继承的表单 Designer.cs 中添加下一个

this.Load += new System.EventHandler(this.BaseForm_Load); this.Closing += new System.ComponentModel.CancelEventHandler(this.BaseForm_Closing);

删除这些行,否则您将在 System.ComponentModel.Design.ServiceContainer.AddService(Type serviceType, ServiceCreatorCallback callback, Boolean promote) 处收到错误

于 2013-04-18T10:30:26.337 回答