Каково состояние игры с визуальным наследованием? - PullRequest
8 голосов
/ 08 сентября 2008

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

Привет.

Ответы [ 6 ]

6 голосов
/ 08 сентября 2008

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

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

Мне казалось, что, пока вы делали все вышеперечисленное, это работало ..... в основном.

3 голосов
/ 08 сентября 2008

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

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

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

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

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

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

2 голосов
/ 08 сентября 2008

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

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

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

public class MyForm<MyObject> : Form

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

1 голос
/ 03 ноября 2008

Мне кажется, я нашел способ избежать этой проблемы.

Не подключайте событие 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();
}

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

ура, Даниэль

1 голос
/ 08 сентября 2008

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

0 голосов
/ 29 января 2010

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

...