Каково состояние игры с визуальным наследованием
У нас есть приложение, которое должно быть гибким в том, как оно отображает свою основную форму для пользователя - в зависимости от пользователя форма должна немного отличаться, может быть дополнительная кнопка здесь или там, или какой-то другой нюанс. Чтобы прекратить писать код для явного удаления или добавления элементов управления и т. Д., Я обратился к визуальному наследованию для решения проблемы - в том, что я считал аккуратным, чистым и логичным стилем ОО - оказывается, что половину времени унаследованным формам приходится нелегко рендеринг тем в 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, использующим сторонние элементы управления сеткой, но вы должны быть осторожны, в частности, НЕОБХОДИМО избегать удаления элементов из коллекций.