我在Win8上使用VS2012(均为RC)在C ++中创建了一个新的Metro Split App。所有东西都是编译和开箱即用的。然后我改变了,并将生成的命名空间更改为我自己的命名空间。经过一些考验和磨难之后,我得到了所有编译而没有任何警告,错误和消息。应用程序(因为它在项目模板中出现)运行正常。
但是,如果我尝试编辑生成的xaml文件(ItemsPage.xaml或SplitPage.xaml),我会在第一行收到“标记错误”:
名称“LayoutAwarePage”在名称空间“using using:A.B.Product.Client.Common”中不存在。
班级的定义是:
namespace A{ namespace B { namespace Product { namespace Client { namespace Common
代码编译好,运行正常。这只发生在设计模式中。
更新:我添加了一个新的xaml文件,并且(在再次修复名称空间之后)一切正常。
如果需要任何其他信息,请与我们联系。
答案 0 :(得分:6)
项目生成的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 和 ABwinmd ,则必须在 ABwinmd 中定义类型A.B.MyClass
。
那么,为什么你的代码在运行时工作而在设计器中不工作?公共类型的命名规则仅适用于Windows运行时组件(对于C ++,DLL文件)中定义的类型,而不适用于应用程序(EXE)。
但是,为了能够实例化用户定义的类型(包括LayoutAwarePage
),设计人员会将项目的EXE作为DLL加载,因此必须遵循命名规则。
答案 1 :(得分:3)
我有一个类似的错误,但后来我关闭了VS,删除了.suo,并重新加载了项目,一切正常。