9

我在 Win8(均为 RC)上使用 VS2012 在 C++ 中创建了一个新的 Metro Split 应用程序。一切都是开箱即用的。然后,我更改了生成的名称空间并将其更改为我自己的名称空间。经过一些试验和磨难,我得到了所有可以编译的东西,没有任何警告、错误或消息。该应用程序(在项目模板中)运行良好。

但是,如果我尝试编辑任何一个生成的 xaml 文件(ItemsPage.xaml 或 SplitPage.xaml),我会在第一行收到“标记错误”:

命名空间“using:ABProduct.Client.Common”中不存在名称“LayoutAwarePage”。

类的定义是:

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

代码编译良好,运行良好。这只发生在设计模式中。

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

如果需要任何其他信息,请告诉我。

4

2 回答 2

6

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

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

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

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

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

于 2012-06-12T21:33:52.147 回答
3

我有一个类似的错误,但后来我关闭了 VS,删除了 .suo,然后重新加载了项目,一切正常。

于 2012-11-13T04:48:49.800 回答