2013-11-07 2 views
2

У меня проблема с одним из моих текущих проектов WPF. Проект использовался для компиляции (и запуска) просто штрафа. Затем мы решили удалить расширенный набор инструментов WPF из библиотек из-за проблем с лицензированием. Я использовал NumericUpDown (ShortUpDown, ... не устаревший), поэтому я решил написать свой собственный.XAML: странное поведение пространства имен Visual Studio

Я написал UserControl и вполне доволен этим, но как только я обменял UpDowns с моим контролем, который я назвал MySpinner он перестал работать:

  • Дизайнер оленья кожа показывать мое окно больше с сообщение об ошибке: «Представление« Дизайн »не может отображаться правильно, потому что некоторые пользовательские элементы еще не созданы»..

  • Мой проект оленья кожа строить больше с большим количеством сообщений об ошибках, заявив, что все мои используемые классы не находятся в их имен (каждый класс, за исключением MySpinner) или (ошибки с кодом позади) о том, что мои названные элементы управления (типа MySpinner) не существует в текущем контексте - вероятно, из-за того, что XAML не компилируется.

Все в моем проекте в пространстве имен DeviceSimulator, который я «импортированной», как con с линией: в начале xmlns:con="clr-namespace:DeviceSimulator" мой Window (который работал отлично раньше).

Если я нахожу <con:, IntelliSense даже правильно представляет мне каждый класс в пространстве имен в качестве возможного завершения.

Я знаю, что есть много вопросов уже с похожими темами, но разница в том, что в моем случае проект не build. Проблема, которую создает проект, несмотря на ошибки, - это то, что я провел несколько раз, но здесь это не так.

Я попробовал предложенные решения по другим вопросам, как перезапуск, восстановления, очистки или изменения цели компиляции из Any CPU в x86 и обратно, но ничего не получалось (строительство и восстановление не работают, потому что решение не суммируются и не компиляции). Все, что я использую, локально находится в папке проекта (за исключением, конечно, определений пространства имен по умолчанию от schemas.microsoft.com...), нет дополнительных библиотек или таких, которые я включаю, и я не работаю в сети или сервере любого типа.

Проблема возникает в Visual Studio 2013, а также в 2012 году, в которой я использую экспресс-версии.

+1

Попробуйте удалить ломаные линии. Реконструкция, а затем повторная установка линий. – Gusdor

+0

@Gusdor Вы имеете в виду удалить каждую строку, которая ссылается на именованный элемент управления в коде и каждую строку, которая использует что-то из пространства имен в XAML? Там бы не осталось много – mgttlinger

+0

Если я правильно помню, ложные ошибки, которые обычно генерирует XAML-дизайнер, иногда могут * заставить VS фактически отказываться от сборки. В настоящее время я всегда оставляю его отключенным. Это длинный снимок, но вы пытались построить новый экземпляр Visual Studio без открытия каких-либо файлов XAML? – nmclean

ответ

2

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

Похоже, что проблема связана с какой-либо циклической зависимостью в проекте (UserControl> XAML> UserControl), который был исправлен путем взлома зависимости, а затем создания одной части, чтобы впоследствии зависимость могла быть повторно вставлена, и проект мог быть скомпилирован в целом.

Я отправил этот ответ, поскольку Гусдор, похоже, не опубликовал его ответ, и я не хотел, чтобы этот вопрос казался без ответа.

+0

вы можете не знать об этом, но вы спасли мою жизнь этим. Я сходил с ума от совершенно необоснованной ошибки, которая появилась только при компиляции (раньше работала нормально), и я не мог исправить ... пока не прочитаю ваше первое предложение. Спасибо, действительно, спасибо. – HypeZ

3

Поскольку пользователь уже нашел решение своей проблемы, это не значит, что это ответ, а не просто информация, касающаяся этой ситуации.

Если вы обнаружили десятки или даже сотни ошибок в решении, которое ранее не имело его, вы можете быть уверены, что это в основном «красные сельди» или ложные/временные ошибки. Это происходит потому, что что-то недавно было изменено и вызвало одно или несколько ошибок в проекте.

Часто в других проектах есть ссылки на текущий сломанный проект, поэтому любые классы, которые ссылаются на классы из разбитого проекта, теперь также показывают одну или несколько ошибок ...это ложные или, точнее, временные ошибки, которые исчезнут, когда фактическая ошибка будет исправлена ​​и проект снова будет построен.

Это может также произойти в одном приложении проекта, когда ошибка в одном классе вызовет другие классы, которые ссылаются на сломанный класс, чтобы отображать ошибки, говорящие о том, что определенный класс не существует, когда это ясно. Это немного похоже на изменение платформы решений или конфигурации решения, за исключением того, что в этом случае Visual Studio поймет, что эти ошибки не являются фактическими ошибками.

Итак, как мы исправим эти проблемы? В общем, это довольно легко, потому что это, как правило, последнее, что было отредактировано, что вызывает фактическую ошибку. Даже если это не так, вы можете посмотреть столбец Project в Error List в Visual Studio и, как правило, самое имя проекта, которое больше всего похоже на ошибку.

Кроме того, вы можете игнорировать множество ошибок, которые говорят что-то вроде «Класс X не может быть найден в пространстве проектов/имён Y», потому что вы знаете, что они это делают. Отслеживание фактической ошибки - самая сложная часть.

Еще один совет, который может помочь для нескольких проектных приложений, заключается в использовании опции Build > Build XXX (ProjectName) вместо опции , чтобы сначала создать разбитый проект. Сначала вам нужно выбрать соответствующий проект в Solution Explorer. Иногда проекты просто нужно строить в определенном порядке, но с использованием опции Build Solution имеет свой собственный порядок сборки, который может быть другим.

Ошибка, которую автор вопроса вначале имела в дизайнере, похожа на все, что им действительно нужно было сделать, - сначала построить проект, содержащий CustomControls, а затем построить оставшиеся проекты, когда у этого проекта был файл dll.

Я надеюсь, что это поможет другим пользователям, столкнувшимся с сотнями ошибок.

+0

Просто немного разъяснений относительно моего проекта. Был только один проект; пользовательский элемент управления был в том же проекте, что и пользовательский интерфейс, поэтому создание только элемента управления не было вариантом. Но ваши рекомендации могут помочь другим споткнуться по этой теме. – mgttlinger

+0

Также было обнаружено, что при появлении большого количества ошибок после изменения, которые не имеют прямого отношения к изменению, это часто может быть связано с тем, что компилятор еще не получил эту часть проекта. ** Пример: ** Мы получили ошибку, чтобы исправить пространство имен в проекте Startup в свойствах Project, потому что мы изменили его в нашем проекте. Он все еще * также * дал ошибки, что пространство имен не удалось найти в тех местах, где мы уже его обновили, но это было связано с тем, что проект не смог попасть в приложение для запуска. ** Мораль: ** Начните с самых больших ошибок, связанных с первым запуском, и работайте вперед. – vapcguy

1

Для того, чтобы увидеть XAML-код в XAML Designer, страница определенно должна быть надлежащей разметкой. Код, который не компилируется, должен быть прокомментирован, поэтому вы можете создать свой проект.

Имел аналогичную проблему в нашем проекте, когда мы пытались перенести класс под названием «BaseView» и страницу XAML из старого проекта в наш новый. Проекты имели разные пространства имен. Страница XAML, которую мы перемещали, унаследовала класс BaseView в коде, а не Page.

  1. Мы сделали «Добавить существующий проект» в рамках Обозревателя решений, а затем сделал перетащить и падение копию класса и страницы (принесшую над его фоновым кодом файл) от старого проекта к новый, все изнутри в обозревателе решений нового проекта в Visual Studio.(Примечание: Позже мы обнаружили, что в нашем новом проекте мы должны создать новую папку, а не перетащить папку, содержащую код из старого проекта, новую, а просто сделать копию старого кода и вставить ее в новую папку) (Подробная информация о том, как мы дошли до этого момента: https://msdn.microsoft.com/en-us/library/879x19d1(v=vs.90).aspx)
  2. Мы обновили пространство имен и using операторы, которые ссылались на старое пространство имен в файле классаи на странице кода XAML.
  3. Мы обновили пространство имен в директиве страницы XAML, которая наследовала от нашего файла класса: <v:BaseView x:Class="OurNamespace.View.PageClassName" ... до vmlns:v="clr-namespace:OurNamespace.View"....

Даже после того, как «Build Solution», мы обнаружили, что дал Страшный «Вид конструкции не может отображаться неправильно, потому что некоторые пользовательские элементы еще не были построены» ошибка. Мы получали ошибки при наведении на <v:BaseView в нашей разметке XAML, что BaseView не размещался в OurNamespace, хотя BaseView изменило свое пространство имен.

Чтобы устранить эту ошибку, между перемещением файла класса в корневой каталог (из папки, в которой была перемещена страница XAML), выполните «Build Solution», а затем переместите его обратно в папку, выполнив другое «Build Solution», , а затем нажав кнопку «Включить код проекта», который находится внизу XAML Designer, слева от горизонтальной полосы прокрутки, мы наконец узнали его, и, наконец, XAML Designer ожил - будь то кнопка или эта вторая сборка, не уверен, что ее решило - вероятно, кнопка, если мне пришлось на нее наложить деньги.

Позже мы обнаружили, что еще вопрос, если мы запустили проект с другой рабочей станции, и это дало бы эту ошибку во вкладке Output, если мы пытались открыть страницу XAML:

C:\Users\<User>\AppData\Local\Microsoft\VisualStudio\12.0\Designer\ShadowCache\4olitigs.k2m\hj4ewy5v.g23\MyApplication.dll 

Could not load file or assembly 'MyApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. This assembly was compiled for a different processor. 

Пока это было хорошо на исходной рабочей станции, это не удалось на втором. Оказывается, это был Цель платформы в Сборка вкладка Свойства проекта. Он должен быть настроен на «Любой процессор» - по крайней мере в нашем случае - во избежание различий между машинами.

+0

Посмотрев на все другие возможные решения, заменив его на любой процессор из нашего предыдущего варианта x64, он исправил его для меня, спасибо! – GoldieLocks

0

Только для справки в будущем, решение для меня состояло в том, что я не добавил «; сборка = MyAssembly» в конце определения пространства имен CLR xmlns.

Смежные вопросы