При создании пользовательских интерфейсов в приложениях WinForms разработчикам приходится выполнять скучную, повторяющуюся работу.
Страшно представить, сколько человеко-часов по всему миру было потрачено на представленные ниже фрагменты пользовательского интерфейса.
Сэкономленное время можно было бы провести с близкими людьми, например, на море.
Форма редактирования адреса.
Форма входа.
В этой статье мы рассмотрим существующие подходы к решению проблемы повторного использования элементов пользовательского интерфейса, предложим другой и обсудим, какой метод лучше.
Статья предназначена для разработчиков WinForms, знакомых с нашей линейкой элементов управления.
Самое простое и универсальное, но невизуальное решение повторного использования элементов пользовательского интерфейса — генерировать их из кода.
Недостаток такого подхода очевиден – невозможно визуально отредактировать результат. Этот недостаток можно компенсировать использованием правильного управления.
Например, наш XAF и Панель приборов по умолчанию генерирует простой пользовательский интерфейс из метаданных, используя XtraLayoutControl , который пользователь впоследствии может изменить во время выполнения.
Пользовательские изменения сохраняются в XML-файле и каждый раз после создания пользовательского интерфейса он загружается из этого файла.
Более того, настройка во время выполнения и загрузка/сохранение макета в XML — это встроенные функции XtraLayoutControl. Первым известным автору визуальным решением для создания повторно используемых элементов интерфейса стала функция Form Visual Inheritance в Delphi. Несколько позже эта возможность появилась в Visual Studio, но она до сих пор плохо реализована и доставляет массу головной боли разработчикам компонентов, которые хоть немного сложнее кнопки.
Не используйте визуальное наследование.
Вместо этого хорошо работает разбиение пользовательского интерфейса на отдельные элементы управления UserControl. Например, форму заказа можно разделить на HeaderUserControl, AddressUserControl, OkCancelButtonsUserControl, которые можно использовать в формах проекта сколько угодно раз.
Это хороший метод, но он не лишен недостатков.
UserControl появляется в Studio Toolbox только в том проекте, в котором он был создан.
При изменении UserControl изменения будут применены везде, где он использовался, и это не всегда хорошо.
Также такое разделение добавляет сложностей с версткой приложения, но если вы используете XtraLayoutControl и при разбиении большой формы создаете не UserControl, а DX-версию XtraUserControl, то проблем с версткой не будет. В версии 14.1 мы серьезно поработали над улучшением этого варианта использования: XtraUserControl может транслировать MinimSize и MaximumSize своих дочерних элементов на верхний уровень, и ситуация, когда XtraUserControl получает на форме меньше места, чем необходимо, больше не должна возникать.
И, наконец, поговорим о предлагаемом подходе к реализации многоразового пользовательского интерфейса.
Мы написали собственный механизм работы со стандартными шаблонами на XtraLayoutControl .
Если вы откроете форму настройки XtraLayoutControl в дизайнере студии и установите флажок «Показать шаблоны», предопределенные шаблоны появятся в списке «Скрытые элементы».
Эта экспериментальная функция станет доступна в версии 14.1.5, которую мы выпускаем сегодня.
Хотя мы отключили возможность создания собственных шаблонов, поскольку у нас нет готового дизайна некоторых элементов, мы надеемся, что этот функционал будет доступен в следующем обновлении.
Шаблон содержит информацию о типах элементов управления, о сборках, которые необходимо добавить в проект при перекидывании элемента управления из шаблона на DesignSurface, фрагмент InitializeComponent, относящийся к выбранным элементам управления.
Пример такого фрагмента показан ниже
При накидывании шаблона получаем следующую последовательность: - добавить зависимые сборки в проект — создать экземпляр элемента управления по типу, указанному в шаблоне.public class textEdit1 : DevExpress.XtraEditors.TextEdit { public void InitializeInstance(DevExpress.XtraEditors.TextEdit target) { ((System.ComponentModel.ISupportInitialize)(target.Properties)).
BeginInit(); target.Location = new System.Drawing.Point(0, 0); target.Name = "textEdit1"; target.Size = new System.Drawing.Size(100, 20); target.TabIndex = 4; ((System.ComponentModel.ISupportInitialize)(target.Properties)).
EndInit(); } }
— скомпилировать временную сборку, содержащую метод инициализации.
— вызвать инициализацию элемента управления с помощью метода из временной сборки.
— добавить инициализированный элемент управления в DesignSurface. Самая большая проблема описанной процедуры — соединения между компонентами.
Например, пользователь настроил удобные ему значения по умолчанию для XtraGridControl. Если в сетке указан источник данных, то метод инициализации будет содержать строку Grid.DataSource =bindingSource1. В шаблоне не будет привязкиBindingSource1, и эта строка выдаст ошибку во время инициализации.
К сожалению, нам пока не удалось придумать эвристику, которая корректно очищала бы внешние соединения в шаблоне.
Скорее всего, в этом случае мы выдадим ошибку на этапе создания шаблона.
Итак, начиная с 14.1.5 у наших пользователей появился еще один визуальный способ повторного использования фрагментов пользовательского интерфейса — шаблоны.
В каких ситуациях ему следует отдать предпочтение? — Шаблоны доступны из любого проекта, а не только в том проекте, где они были созданы, главное, чтобы .
NET мог найти все необходимые для шаблона сборки в момент инициализации шаблона.
— Не всегда удобно создавать в проекте отдельный UserControl ради нескольких контролов.
— Применение изменений в UserControl во всех местах его использования не всегда желательно; шаблоны создают независимые копии элементов управления, которые легко изменить непосредственно в форме.
Здесь, наверное, уместно провести аналогию между шаблонами и сниппетами.
Языки .
NET предоставляют множество способов избежать дублирования кода, но, несмотря на это, в студии есть сниппеты, которые иногда просто удобнее.
Теги: #.
NET #winforms #devexpress #devexpress #devexpress #Разработка веб-сайтов #.
NET
-
Рост Популярности Розовых Ноутбуков
19 Oct, 24 -
Знакомство С Ремонтом Iphone
19 Oct, 24 -
Переключение С Growl На Центр Уведомлений
19 Oct, 24