2012-06-12 78 views
9

我使用Win8(均爲RC)上的VS2012在C++中創建了一個新的Metro Split App。所有的東西都是編譯出來的。然後,我改變了過去,並將生成的命名空間更改爲我自己的。在經歷了一些考驗和磨難之後,我得到了一切都沒有警告,錯誤和消息的編譯。該應用程序(因爲它在項目模板中)運行良好。XAML無法在本地命名空間中找到引用

但是,如果我嘗試編輯無論是在第一線所產生的XAML文件(ItemsPage.xaml或SplitPage.xaml)我得到一個「標記錯誤」的:

「LayoutAwarePage」的名稱不存在在命名空間「using:ABProduct.Client.Common」中。

類的定義是:

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

代碼編譯罰款,並運行良好。這隻發生在設計模式中。

更新:我添加了一個新的xaml文件和(修復命名空間後)一切工作。

請讓我知道是否需要任何額外的信息。

+1

您的項目生成的.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,所以如果你想使用這個設計器,你的類也必須在應用程序項目中匹配相同的命名要求。 –

+0

[如果這沒有幫助,請讓我知道,我可以幫助調查。] –

+0

太棒了! WinMD文件只是Client.winmd。我卸載了該項目,將根名稱空間更改爲A.B.Product.Client,然後重新加載並重建項目。 WinMD文件現在稱爲A.B.Product.Client,並且XAML正確加載。這絕對是答案。如果你想添加你的評論作爲答案,我會標記它。 – basilard99

回答

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.winmdA.B.winmd,則A.B.MyClass型號必須在A.B.winmd中定義。

那麼,爲什麼你的代碼在運行時工作,而不是在設計器中工作?公共類型的命名規則僅適用於在Windows運行時組件(適用於C++,DLL文件)中定義的類型,而不適用於應用程序(EXE)。

但是,爲了能夠實例化您的用戶定義類型(包括LayoutAwarePage),設計人員會將您的項目的EXE加載爲DLL,因此必須遵守命名規則。

+0

我也發現(例如當將視圖模型類移動到不同的名稱空間時),我必須關閉設計器窗口,構建並重新打開窗口,以便設計器成功重新加載組件。 – camflint

+0

@ cflint07:不需要關閉和重新打開設計器;它應該在構建完成後自動重新加載。如果沒有發生這種情況,請考慮在[Microsoft連接](http://connect.microsoft.com/VisualStudio)上打開一個錯誤。 –

3

我有一個類似的錯誤,但後來我關閉VS,刪除.suo,並重新加載項目,一切正常。

+0

哇它的工作!謝謝!! –

+1

這樣做的問題是軟件可能無法通過商店認證過程。所以這只是一個臨時解決方案。 – Julius

+0

我明白了,我想我只需要重新生成.suo文件。 :) –

相關問題