XAML не может найти ссылку в локальном пространстве имен

Я создал новое приложение Metro Split в C ++, используя VS2012 на Win8 (оба RC). Все скомпилировано и работает из коробки. Затем я изменил, прошел и изменил сгенерированные пространства имен на свои собственные. После некоторых испытаний и невзгод я получил все для компиляции без предупреждений, ошибок и сообщений. Приложение (как оно есть в шаблоне проекта) работает нормально.

Однако, если я пытаюсь редактировать любой из сгенерированных файлов xaml (ItemsPage.xaml или SplitPage.xaml), я получаю & quot; Ошибка разметки & quot; на первой строке:

Название & quot; LayoutAwarePage & quot; не существует в пространстве имен, используя: A.B.Product.Client.Common & quot ;.

Определение класса:

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

Код компилируется нормально и работает нормально. Это происходит только в режиме дизайна.

ОБНОВЛЕНИЕ: я добавил новый файл xaml и (после исправления пространств имен) все заработало.

Пожалуйста, дайте мне знать, если нужна дополнительная информация.

 basilard9912 июн. 2012 г., 23:17
Фантастика! Файл WinMD был просто Client.winmd. Я выгрузил проект, изменил корневое пространство имен на A.B.Product.Client, затем перезагрузил и перестроил проект. Файл WinMD теперь называется A.B.Product.Client, и XAML загружается правильно. Это определенно ответ. Если вы хотите добавить свой комментарий в качестве ответа, я отмечу его.
 James McNellis12 июн. 2012 г., 23:06
[Если это не поможет, пожалуйста, дайте мне знать, и я могу помочь в расследовании.]
 James McNellis12 июн. 2012 г., 23:04
Как называется файл .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, поэтому, если вы хотите использовать дизайнер, ваши классы должны соответствовать тем же требованиям именования и в проектах приложений.

Ответы на вопрос(2)

Решение Вопроса

созданного вашим проектом, должно быть некоторым префиксом пространств имен, в которых определены публичные типы 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.winmd а такжеA.B.winmdтипA.B.MyClass должны быть определены вA.B.winmd.

Итак, почему ваш код работает во время выполнения, а не в дизайнере? Правила именования для открытых типов применяются только к типам, определенным в компонентах среды выполнения Windows (для C ++, файлов DLL), но не для приложений (EXE).

Тем не менее, чтобы иметь возможность создавать свои пользовательские типы (включаяLayoutAwarePage), дизайнер загрузит EXE вашего проекта в виде DLL, поэтому необходимо соблюдать правила именования.

 23 сент. 2012 г., 07:32
@ cflint07: закрытие и повторное открытие дизайнера не требуется; он должен автоматически перезагрузиться сразу после завершения сборки. Если этого не происходит, рассмотрите возможность открытия ошибки наMicrosoft Connect.
 22 сент. 2012 г., 19:34
Я также обнаружил (например, при перемещении класса модели представления в другое пространство имен) мне нужно закрыть окно конструктора, построить и заново открыть окно для компонента, который будет успешно перезагружен дизайнером.

У меня была похожая ошибка, но затем я закрыл VS, удалил .suo, перезагрузил проект, и все работало просто отлично.

 05 дек. 2012 г., 01:30
Я вижу, я думаю, что мне просто нужно будет восстановить файл .suo. :)
 04 дек. 2012 г., 17:56
Проблема заключается в том, что программное обеспечение может не пройти процесс сертификации магазина. Так что это только временное решение.
 17 июл. 2013 г., 12:25
Я попробовал это, и это не сработало для меня. Потом я нашел статью (wpflocalizeextension.codeplex.com/discussions/399736) который предложил «разблокировать»; DLL - мои были заблокированы, но разблокировка их не имела никакого эффекта. Наконец, исправили проблему, удалив suo и разблокировав DLL.
 04 дек. 2012 г., 00:34
Вау, это сработало! Спасибо!!

Ваш ответ на вопрос