Каково состояние игры с визуальным наследованием

У нас есть приложение, которое должно быть гибким в том, как оно отображает свою основную форму для пользователя - в зависимости от пользователя форма должна немного отличаться, может быть дополнительная кнопка здесь или там, или какой-то другой нюанс. Чтобы прекратить писать код для явного удаления или добавления элементов управления и т. Д., Я обратился к визуальному наследованию для решения проблемы - в том, что я считал аккуратным, чистым и логичным стилем ОО - оказывается, что половину времени унаследованным формам приходится нелегко рендеринг тем в VS без уважительной причины и т. д. - и у меня возникает ощущение, что разработчики и в некоторой степени Microsoft избегают практики визуального наследования - можете ли вы подтвердить это, я что-то здесь упускаю?

С уважением.

6 ответов

Решение

Я думал, что в 2005 году они более или менее разобрались с дизайнером настольных компьютеров. Вы пробовали обычных преступников?

  • Нет абстрактных типов управления
  • Нет аргументов конструктора в любой форме
  • Инициализация перемещена в Form_Load, а не в Ctor
  • Нет элементов управления в том же проекте, что и пользовательский элемент управления / форма, в которую они помещены
  • Закрыть все документы -> Очистить -> Восстановить
  • Перезагрузите VS

Кажется, я думал, что пока ты делал все вышеперечисленное, это работало..... в основном.

Я учусь на MCAD (по общему признанию, который скоро будет устаревшим), и частью элемента WinForms было Visual Inheritence.

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

Для меня главная проблема - всегда инициализация. Вы должны помнить, что дизайнер не может / не создает экземпляры форм так же, как во время выполнения (аналогично, он не может сделать это с веб-разработчиком, поэтому необходима осторожность). с пользовательским управлением рендеринга).

Кроме того, после изменения формы требуется полная перестройка проекта, чтобы распространить изменения в форме на дочерние формы, которые наследуют ее.

Лично я не видел никаких доказательств, чтобы предположить, что это было "избегать". AFAIK, все еще хорошая практика - по возможности использовать повторно код. Визуальное наследование обеспечивает это.

Могу ли я предложить создать новый вопрос с реальными проблемами, с которыми вы сталкиваетесь, с примером кода? Затем мы можем посмотреть на это, чтобы увидеть, можем ли мы заставить его работать, и объяснить, почему:)

Я видел некоторые проблемы в VS2005 с этим. В основном это были проблемы с построением форм-объектов в конструкторе. Были проблемы с кодом, который пытался получить доступ к базе данных из конструкторов форм и т. Д.

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

Еще одна проблема, которую я помню, - это дженерики в классах форм

public class MyForm<MyObject> : Form

это не сработает

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

Не подключайте событие Form_Load в родительской форме, это нарушит конструктор.

Также не удаляйте пустой конструктор по умолчанию из Visual Studio в родительской форме. Если вы хотите использовать Dependency Injection, создайте другой конструктор.

Как это:

public ProductDetail()
{
    InitializeComponent();
}

public ProductDetail(ISupplierController supplierController) : base()
{
    InitializeComponent();
    this.supplierController = supplierController;
}

Затем вы можете сделать это из вашей унаследованной формы:

public NewProduct(ISupplierController supplierController)
    : base(supplierController)
{
    InitializeComponent();
}

До сих пор это работало для меня, и у меня тоже были некоторые странные дизайнерские проблемы.

ура, Даниэль

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

Прочитайте это: http://cs.rthand.com/blogs/blog_with_righthand/archive/2005/11/10/186.aspx

AFAIK, все еще есть проблемы с визуальным наследованием и объектами, которые полагаются на коллекции для элементов дизайна, обычно для элементов управления сеткой и т. Д. Я считаю, что MS все еще исключила возможность изменения f.ex. GridView в унаследованной форме / usercontrol и т. д. Но другие элементы управления, такие как TextBox, Form, UserControl, Panel и т. д., должны работать должным образом.

До сих пор у меня не было проблем с VI, использующим сторонние элементы управления сеткой, но вы должны быть осторожны, в частности, НЕОБХОДИМО избегать удаления элементов из коллекций.

Другие вопросы по тегам