2012-06-12 15 views
9

Ich habe eine neue Metro Split App in C++ mit VS2012 auf Win8 (beide RC) erstellt. Alles kompiliert und ausgearbeitet. Ich habe dann geändert und die generierten Namespaces zu meinen eigenen geändert. Nach ein paar Versuchen und Schwierigkeiten habe ich alles kompiliert, ohne Warnungen, Fehler oder Nachrichten. Die App (wie sie in der Projektvorlage enthalten ist) läuft gut.XAML kann keine Referenz im lokalen Namespace finden

aber wenn ich versuche, eine der beiden generierten XAML-Dateien (ItemsPage.xaml oder SplitPage.xaml) Ich habe ein „Markup-Fehler“ erhalten bearbeiten in der ersten Zeile:

Der Name „LayoutAwarePage“ existiert nicht im Namespace "using: ABProduct.Client.Common".

Die Definition der Klasse ist:

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

Der Code kompiliert in Ordnung, und läuft gut. Dies geschieht nur im Entwurfsmodus.

UPDATE: Ich habe eine neue XAML-Datei hinzugefügt und (nachdem ich die Namespaces wieder eingerichtet habe) hat alles funktioniert.

Bitte lassen Sie mich wissen, wenn zusätzliche Informationen benötigt werden.

+1

Wie lautet der Name der von Ihrem Projekt erstellten .winmd-Datei? Der Name der .winmd-Datei muss ein Präfix des Namensbereichs sein. Für diesen Namespace muss der .winmd also A.winmd, A.B.winmd, A.B.Product.winmd, A.B.Product.Client.winmd oder A.B.Product.Client.Common.winmd heißen. Diese Anforderung wird von der Laufzeit für öffentliche Typen in Komponenten (dlls) festgelegt. Der Designer lädt die exe jedoch als DLL. Wenn Sie also den Designer verwenden möchten, müssen Ihre Klassen auch in Anwendungsprojekten denselben Namensanforderungen entsprechen. –

+0

[Wenn das nicht hilft, bitte lass es mich wissen und ich kann helfen zu untersuchen.] –

+0

Fantastisch! Die WinMD-Datei war einfach Client.winmd. Ich habe das Projekt entladen, den Stammnamespace in A.B.Product.Client geändert, das Projekt neu geladen und neu erstellt. Die WinMD-Datei heißt nun A.B.Product.Client und XAML wird korrekt geladen. Das ist definitiv die Antwort. Wenn Sie Ihren Kommentar als Antwort hinzufügen möchten, markiere ich ihn. – basilard99

Antwort

6

Der Name der WinMD-Datei, die von Ihrem Projekt erstellt wird, muss ein Präfix der Namespaces sein, in denen die öffentlichen WinRT-Typen definiert sind. In Anbetracht, dass Ihre Art ist in dem A.B.Product.Client.Common Namespace muss die WinMD Datei einen der folgenden Namen hat:

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

Die öffentlichen Typen müssen auch in der WinMD Datei mit dem längsten Präfix definiert werden, die den Namensraum entspricht. Also, wenn Sie beide A.winmd und A.B.winmd haben, muss der Typ A.B.MyClass in A.B.winmd definiert werden.

Warum funktioniert Ihr Code zur Laufzeit, aber nicht im Designer? Die Namensregeln für öffentliche Typen gelten nur für Typen, die in Windows-Laufzeitkomponenten (für C++, DLL-Dateien) definiert sind, nicht für Anwendungen (EXEs).

Um jedoch Ihre benutzerdefinierten Typen (einschließlich LayoutAwarePage) instanziieren zu können, lädt der Designer die EXE Ihres Projekts als DLL, sodass die Benennungsregeln befolgt werden müssen.

+0

Ich finde auch (z.B.Beim Verschieben einer View-Model-Klasse in einen anderen Namespace muss ich das Designer-Fenster schließen, das Fenster erstellen und erneut öffnen, damit die Komponente vom Designer erfolgreich neu geladen werden kann. – camflint

+0

@ cflint07: Das Schließen und erneute Öffnen des Designers sollte nicht erforderlich sein; Es sollte automatisch nach Abschluss des Builds neu geladen werden. Wenn dies nicht der Fall ist, sollten Sie einen Fehler in [Microsoft Connect] (http://connect.microsoft.com/VisualStudio) beheben. –

3

Ich hatte einen ähnlichen Fehler, aber dann schloss ich VS, löschte die. Suo, und lud das Projekt neu und alles funktionierte gut.

+0

Wow, es hat funktioniert! Vielen Dank!! –

+1

Das Problem dabei ist, dass die Software den Store-Zertifizierungsprozess möglicherweise nicht besteht. Das ist also nur eine vorübergehende Lösung. – Julius

+0

Ich sehe, ich denke, ich muss nur die. Suo-Datei neu generieren. :) –

Verwandte Themen