Ошибки с Microsoft WinForms Series 1: Графическое устройство

У меня проблема с этим образцом. Я просто скачал его и запустил (Visual Studio 2010). Я ничего не трогал. введите описание изображения здесь

Извините за язык, он на итальянском. Сверху вниз написано:

  • Чтобы избежать потери информации перед загрузкой окна дизайнера, необходимо устранить следующие ошибки:
  • Невозможно визуализировать конструктор Windows для файла, потому что нельзя создать класс. Утилита конструктора проверила эти классы: SpinningTriangleControl --- Не удается загрузить его базовый класс «WinFormsGraphicsDevice.GraphicsDeviceControl». Убедитесь, что есть ссылка на сборку и что все проекты созданы.
  • Ниже сказано то же самое

Обратите внимание, что:

  • Если я компилирую и запускаю, все работает.
  • На панели инструментов ide иногда (я не понял когда) есть два элемента управления, созданные с помощью этого образца, SpinningTriangleControl и SpriteFont; иногда они исчезают. Когда это происходит, элементы управления также удаляются из формы MainWindow проекта!
  • Я не знаю, важно ли это, но я заметил, что элемент управления часто исчезает и удаляется из xxx.designer.cs, пока я добавляю новый элемент управления, например, toolstripmenu и т. Д., Или добавляю новое событие Обработчик некоторого контроля.

Я действительно не понимаю, что происходит.

Редактировать JT: Репро здесь: sdrv.ms/1kIhI5o

Этапы воспроизведения:

Открытое решение
Выберите элемент управления flowLayoutPanel1
Запустите приложение
Остановите приложение
Теперь попробуйте выбрать gameWrapper!

Результат:
Элемент управления gameWrapper больше не может быть выбран, он даже не отображается в раскрывающемся списке Windows свойств элементов управления формы!


person Francesco Bonizzi    schedule 09.12.2013    source источник
comment
Этот образец был представлен 1/10/2008, может быть, этот проект хочет, чтобы VS2008 работал правильно, не так ли? PS: приятно видеть здесь других итальянцев   -  person pinckerman    schedule 15.12.2013
comment
Спасибо за совет, может быть, думаю. PS. Я тоже очень рада :)   -  person Francesco Bonizzi    schedule 15.12.2013
comment
@misiMe Этот пример приложения чертовски глючит! Я запускал его пару раз, ничего не менял, и теперь левая панель не отображается. Я следил за вашими шагами по воспроизведению, пытаясь найти правильную панель, чтобы вызвать проблему с дизайнером, но не могу. Не могли бы вы загрузить свое решение (на веб-сайте временного обмена вырежьте все, что не имеет отношения к делу), чтобы я / мы могли воспроизвести вашу проблему из первых рук и посмотреть, смогу ли я / мы диагностировать основную причину.   -  person Jeremy Thompson    schedule 25.12.2013
comment
@JeremyThompson Большое спасибо! Вот ссылка: sdrv.ms/1kIhI5o Как я заархивировал файл с двумя проектами: откройте проект OhmGameProject. Здесь вы можете воспроизвести проблему, открыв окно конструктора MainForm, а затем запустив приложение. При выходе из приложения (я сделал это нажатием x в окне) вы вернетесь в конструктор Windows. Здесь (иногда) вы можете заметить, что вы не можете выбрать элемент управления GameWrapper2 (вот в чем проблема). Затем, если вы попытаетесь добавить какой-либо элемент управления повсюду, сохраните, закройте окно дизайнера и снова откройте его, GameWrapper2 не будет там   -  person Francesco Bonizzi    schedule 26.12.2013


Ответы (7)


Я видел это в нескольких сценариях.

1) Проект получает ссылку на себя.

Если у вас есть пользовательский элемент управления в проекте A, и вы используете дизайн для добавления пользовательского элемента управления в форму также в проекте A, Visual Studio добавит ссылку на себя, которая испортит дизайнера.

2) Создание абстрактного базового класса для визуального элемента.

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

3) Ошибка DesignMode

Если вы используете свойство DesignMode, чтобы определить, должны ли UserControls загружать данные в таком событии, как Load (), вам нужно знать, что DesignMode сломается, если вы вложите элементы управления более чем на один уровень в глубину. Вы можете обойти это, создав свою собственную переменную designmode, отключив LicenseManager.UsageMode.

person Scope Creep    schedule 23.12.2013
comment
Да, класс абстрактный, как я могу это решить? Также иногда он нарисован, иногда нет. - person Francesco Bonizzi; 24.12.2013
comment
Ваш базовый класс должен быть конкретным, а не абстрактным классом. Для этого вам нужно будет переключить все ваши абстрактные методы на виртуальные. Ключевое слово virtual позволит вам или другим разработчикам переопределить базовую реализацию, но если в подклассе не предоставляется переопределенная реализация, по умолчанию будет использоваться базовая реализация. Я знаю, что это может раздражать, потому что вы, вероятно, хотели ПРИНУДИТЕЛЬНО реализовать определенные методы в подклассах, отсюда и ключевое слово abstract ... но использование виртуальных методов позволит вам сохранить поддержку дизайнера. - person Scope Creep; 26.12.2013
comment
Спасибо. После долгих поисков это ДЕЙСТВИТЕЛЬНОЕ решение моей проблемы. Я просто удалил abstract из GraphicsDeviceControl и сделал виртуальными два абстрактных метода (Update и Draw). Спасибо! - person Francesco Bonizzi; 06.01.2014

Это случается и со мной время от времени. Единственное, что работает, - это удаление настраиваемого элемента управления из окна и его повторное добавление.

person Mariano    schedule 10.12.2013

Я добавил в ваш вопрос шаги воспроизведения и столкнулся с половиной проблемы.

Действия по воспроизведению:
1. Открытое решение
2. Выбор элемента управления flowLayoutPanel1
3. Запуск приложения
4. Остановка приложения

Тогда я не мог выбрать элемент управления gameWrapper! Элемент управления gameWrapper даже не отображался в раскрывающемся списке элементов управления формы окна свойств!

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

Чтобы воспроизвести SpinningTriangleControl.cs пользовательский элемент управления, который невозможно открыть, как показано на вашем снимке экрана, вы просто не учитываете using OhmGame_Level_editor; ссылку на пространство имен:

введите описание изображения здесь

введите описание изображения здесь

Добавление using OhmGame_Level_editor; позволило мне открыть пользовательский элемент управления SpinningTriangleControl.cs без ошибки дизайнера.

Это должна быть ошибка XNA / Visual Studio - как, когда выбран элемент управления, кроме gameWrapper, а затем после запуска / остановки приложения элемент управления gameWrapper виден, но не может быть выбран!

Обходной путь:
Я обнаружил, что когда я открыл решение и заблокировал элемент управления gameWrapper, я мог выбрать его независимо от того, был он выбран или не выбран при запуске / остановке приложения.

введите описание изображения здесь

person Jeremy Thompson    schedule 26.12.2013
comment
К сожалению, спустя много времени, хотя я заблокировал элементы управления, gameWrapper исчез, как и раньше ... - person Francesco Bonizzi; 29.12.2013
comment
Сожалеем об этом, предлагаем вам обсудить этот вопрос с Microsoft на странице connect.microsoft.com. Я уверен, что инженер из Редмонда сможет довольно быстро воспроизвести проблему и дать совет. При самостоятельном запуске примера проекта (несколько раз) левая панель исчезает, поэтому очевидно, что в нем есть ошибки. - person Jeremy Thompson; 30.12.2013
comment
В любом случае спасибо :) Хорошего года! - person Francesco Bonizzi; 30.12.2013

Обычно такая проблема возникает при создании настраиваемого элемента управления. Для этого соберите WinFormsGraphicsDevice и вставьте сгенерированный exe-файл по следующему пути к используемой вами версии Visual Studio.

C: \ Program Files \ Microsoft Visual Studio \ Common7 \ IDE

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

person sunnytyra    schedule 16.12.2013
comment
Пробую вот так, потом посмотрю :) Спасибо! - person Francesco Bonizzi; 16.12.2013
comment
Я не уверен, но могу разработать справку по отладке времени, чтобы понять, в чем проблема. msdn.microsoft.com/en-us/ библиотека / 5ytx0z24% 28v = vs.90% 29.aspx - person sunnytyra; 17.12.2013

Похоже, это вызвано неправильной ссылкой. Попробуйте следующее: Закройте все файлы. Очистите раствор и восстановите. Затем найдите проект или dll, в которых определен класс GraphicsDeviceControl. Удалить ссылку. Повторно добавить ссылку, перестроить. Попробуйте снова открыть элемент управления.

person Radin Gospodinov    schedule 17.12.2013

Вы должны попытаться добавить несколько попыток / уловок и использовать точки останова и найти с ними исключение. Также я думаю, что ваша проблема связана с чем-то с компонентом GUI, таким как SpriteFont, ContentManager, GraphicsDevice ... Например:

content = new ContentManager(Services, "Content"); 

spriteBatch = new SpriteBatch(GraphicsDevice); 

font = content.Load<SpriteFont>("fontName"); // make sure font was loaded fine.
person Ringo    schedule 20.12.2013
comment
На самом деле я использую Visual Studio 2010 pro со всеми установленными обновлениями. - person Francesco Bonizzi; 21.12.2013

У меня была проблема в дизайнере с формой, которая наследуется от других форм. Дизайнер просто не хочет их отображать. В моем случае дизайнер был потерян, потому что не было конструктора без аргументов. Код компилировался и выполнялся хорошо, потому что я использовал конструктор с 1 аргументом. Чтобы немного привести в порядок код, я попытался удалить конструктор без аргументов, но мне пришлось вернуть его обратно, чтобы конструктор заработал. Вы можете попытаться установить конструктор без аргументов как в унаследованном, так и в базовом элементе управления.

person Guillaume Michel    schedule 20.12.2013