我在Win8(均为RC)上使用VS2012在C ++中创建了一个新的Metro Split App。一切都已编译并立即可用。然后,我进行了更改,并将生成的名称空间更改为我自己的名称空间。经过一番试验和磨难,我可以编译所有内容,没有警告,错误或消息。该应用程序(随项目模板一起提供)运行良好。

但是,如果我尝试编辑两个生成的xaml文件(ItemsPage.xaml或SplitPage.xaml),则第一行会出现“标记错误”:

名称空间“ using:A.B.Product.Client.Common”中不存在名称“ LayoutAwarePage”。

该类的定义是:

namespace A{ namespace B { namespace Product { namespace Client { namespace Common


该代码可以正常运行。这仅在设计模式下发生。

更新:我添加了一个新的xaml文件,并且(在再次修复名称空间之后)一切正常。

请让我知道是否需要其他信息。

最佳答案

您的项目生成的WinMD文件的名称必须是在其中定义了公共WinRT类型的名称空间的某些前缀。假定您的类型在A.B.Product.Client.Common命名空间中,则WinMD文件必须具有以下名称之一:

A.winmd
A.B.winmd
A.B.Product.winmd
A.B.Product.Client.winmd
A.B.Product.Client.Common.winmd


还必须在WinMD文件中使用与名称空间匹配的最长前缀定义公用类型。因此,如果您同时拥有A.winmd和A.B.winmd,则必须在A.B.winmd中定义类型A.B.MyClass

那么,为什么您的代码在运行时有效却在设计器中无效?公共类型的命名规则仅适用于Windows运行时组件中定义的类型(适用于C ++,DLL文件),不适用于应用程序(EXE)。

但是,为了能够实例化用户定义的类型(包括LayoutAwarePage),设计器会将项目的EXE加载为DLL,因此必须遵循命名规则。

07-28 03:46