2012-06-12 30 views
9

Stworzyłem nową aplikację Metro Split w C++ za pomocą VS2012 na Win8 (oba RC). Wszystko skompilowane i opracowane po wyjęciu z pudełka. Następnie zmieniłem działanie i zmieniłem wygenerowane przestrzenie nazw na własne. Po kilku próbach i udrękach, dostałem wszystko do skompilowania bez ostrzeżeń, błędów, ani wiadomości. Aplikacja (jak jest w szablonie projektu) działa dobrze.XAML nie może znaleźć odwołania w lokalnej przestrzeni nazw

Jednakże, jeśli staram się zmieniać zarówno generowanych plikach XAML (ItemsPage.xaml lub SplitPage.xaml) pojawia się „błąd Markup” na pierwszej linii:

Nazwa „LayoutAwarePage” nie istnieje w przestrzeni nazw "używając: ABProduct.Client.Common".

Definicja klasy jest:

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

Kod kompiluje i działa poprawnie. Dzieje się tak tylko w trybie projektowania.

AKTUALIZACJA: Dodałem nowy plik xaml i (po poprawieniu przestrzeni nazw) wszystko działało.

Proszę dać mi znać, jeśli potrzebujesz dodatkowych informacji.

+1

Jaka jest nazwa pliku .winmd wygenerowanego przez projekt? Nazwa pliku .winmd musi być prefiksem nazwy przestrzeni nazw. Tak więc, dla tej przestrzeni nazw, .winmd musi mieć nazwy A.winmd, A.B.winmd, A.B.Product.winmd, A.B.Product.Client.winmd lub A.B.Product.Client.Common.winmd. Wymóg ten jest nakładany przez środowisko wykonawcze dla typów publicznych w komponentach (bibliotekach DLL). Jednak projektant kończy ładowanie exe jako biblioteki dll, więc jeśli chcesz używać projektanta, twoje klasy muszą również spełniać te same wymagania nazewnicze w projektach aplikacji. –

+0

[Jeśli to nie pomoże, proszę dać mi znać, a ja mogę pomóc w zbadaniu.] –

+0

Fantastyczne! Plik WinMD był po prostu Client.winmd. Rozładowałem projekt, zmieniłem główny obszar nazw na A.B.Product.Client, a następnie ponownie załadowałem i przebudowałem projekt. Plik WinMD nazywa się teraz A.B.Product.Client, a XAML ładuje się poprawnie. To zdecydowanie odpowiedź. Jeśli chcesz dodać swój komentarz jako odpowiedź, zaznaczę to. – basilard99

Odpowiedz

6

Nazwa pliku WinMD wygenerowanego przez projekt musi być pewnym prefiksem przestrzeni nazw, w którym zdefiniowane są publiczne typy WinRT. Biorąc pod uwagę, że typ jest w przestrzeni nazw A.B.Product.Client.Common, plik WinMD musi mieć jedną z następujących nazw:

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

Typy publiczne muszą być również zdefiniowane w pliku WinMD z najdłuższym prefiksem, który pasuje do nazw. Tak więc, jeśli masz zarówno A.winmd i A.B.winmd, typ musi być zdefiniowany w A.B.winmd.

Dlaczego więc twój kod działa w środowisku wykonawczym, ale nie w projektancie? Reguły nazewnictwa dla typów publicznych mają zastosowanie tylko do typów zdefiniowanych w komponentach wykonawczych systemu Windows (dla C++, plików DLL), a nie dla aplikacji (EXE).

Jednakże, aby móc tworzyć instancje typów zdefiniowanych przez użytkownika (w tym LayoutAwarePage), projektant załaduje plik EXE twojego projektu jako plik DLL, więc należy przestrzegać reguł nazewnictwa.

+0

Również znajduję (np.podczas przenoszenia klasy modelu widoku do innej przestrzeni nazw) Muszę zamknąć okno projektanta, zbudować i ponownie otworzyć okno, aby komponent mógł zostać pomyślnie załadowany przez projektanta. – camflint

+0

@ cflint07: Zamknięcie i ponowne otwarcie projektanta nie powinno być wymagane; powinien ponownie załadować się automatycznie zaraz po zakończeniu kompilacji. Jeśli tak się nie stanie, rozważ otwarcie błędu w [Microsoft Connect] (http://connect.microsoft.com/VisualStudio). –

3

Miałem podobny błąd, ale potem zamknąłem VS, usunąłem .suo i ponownie załadowałem projekt i wszystko działało dobrze.

+0

Wow, zadziałało! Dzięki!! –

+1

Problem z tym związany polega na tym, że oprogramowanie może nie przejść procesu certyfikacji sklepu. To tylko tymczasowe rozwiązanie. – Julius

+0

Rozumiem, myślę, że po prostu potrzebuję regenerować plik .suo. :) –

Powiązane problemy