Windows 8 XAML在本地命名空间中找不到引用 我在C++中使用VS2012在Win8(RC)上创建了一个新的Meta分裂应用程序。一切都是开箱即用的。然后,我修改了,并将生成的名称空间修改为我自己的名称空间。经过一些考验和磨难,我得到了所有要编译的东西,没有警告、错误和消息。应用程序(在项目模板中)运行良好

Windows 8 XAML在本地命名空间中找不到引用 我在C++中使用VS2012在Win8(RC)上创建了一个新的Meta分裂应用程序。一切都是开箱即用的。然后,我修改了,并将生成的名称空间修改为我自己的名称空间。经过一些考验和磨难,我得到了所有要编译的东西,没有警告、错误和消息。应用程序(在项目模板中)运行良好,windows-8,visual-studio-2012,microsoft-metro,Windows 8,Visual Studio 2012,Microsoft Metro,但是,如果我尝试编辑生成的xaml文件(ItemsPage.xaml或SplitPage.xaml),我会在第一行出现“标记错误”: 名称“LayoutAwarePage”在命名空间“using:A.B.Product.Client.Common”中不存在 该类的定义为: namespace A{ namespace B { namespace Product { namespace Client { namespace Common 代码编译良好,运行良好。这仅在设计模式下发生 更新:我添加

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

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

该类的定义为:

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.winmdA.B.winmd,则必须在A.B.winmd中定义类型
A.B.MyClass

那么,为什么您的代码在运行时工作,而在设计器中不工作呢?公共类型的命名规则只适用于Windows运行时组件(C++、DLL文件)中定义的类型,而不适用于应用程序(exes)。
但是,为了能够实例化用户定义的类型(包括
LayoutAwarePage
),设计器将以DLL的形式加载项目的EXE,因此必须遵循命名规则。

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

项目生成的.winmd文件名是什么?.winmd文件的名称必须是命名空间名称的前缀。因此,对于该名称空间,.winmd必须命名为A.winmd、A.B.winmd、A.B.Product.winmd、A.B.Product.Client.winmd或A.B.Product.Client.Common.winmd。此要求是由运行时对组件中的公共类型(DLL)强加的。但是,设计器最终将您的exe作为dll加载,因此如果您想使用设计器,您的类也必须符合应用程序项目中相同的命名要求。[如果没有帮助,请让我知道,我可以帮助调查。]太棒了!WinMD文件只是Client.WinMD。我卸载了项目,将根命名空间更改为A.B.Product.Client,然后重新加载并重建了项目。WinMD文件现在称为A.B.Product.Client,XAML将正确加载。这绝对是答案。如果要添加注释作为答案,我会标记它。我还发现(例如,当将视图模型类移动到其他命名空间时),我必须关闭设计器窗口,生成并重新打开该窗口,设计器才能成功重新加载组件。@cflint07:不需要关闭并重新打开设计器;它应该在构建完成后立即自动重新加载。如果没有发生,请考虑打开一个bug。这样做的问题是软件可能无法通过商店认证过程。所以这只是一个临时解决方案。我明白了,我想我只需要重新生成.suo文件。:)我试过这个,但不管用。然后我发现一篇文章()建议“取消阻止”DLL-我的被阻止,但取消阻止没有效果。最后,通过删除suo并取消阻止DLL修复了该问题。