Подтвердить что ты не робот

WPF ControlTemplate vs UserControl

Недавно я создал UserControl, что заняло довольно много времени, потому что мне приходилось работать с настраиваемыми свойствами зависимостей и т.д.

В любом случае это всего лишь пучок из трех элементов управления: TextBox, Popup с иерархическим деревом.

Теперь я понял, что могу написать ControlTemplate. Следовательно, что такое преимущество использования UserControl?

4b9b3361

Ответ 1

Здесь есть три случая: UserControl, ControlTemplate и пользовательский элемент управления. (Я предполагаю, что DataTemplate не нуждается в объяснении)

A настраиваемый элемент управления - это то, что вы предоставляете при создании базовых функциональных возможностей нового компонента пользовательского интерфейса. Для этого существуют разные плюсы и минусы, но, например, если вы хотите настраивать поведение ItemsControl, вы можете лучше всего сделать это путем подсекции Selector или MultiSelector (это делает DataGrid от wpftoolkit). Кроме того, если вам нужен объект, который будет содержать новый DependencyProperty, в большинстве случаев вы получите Control.

Принцип wpf, содержащийся здесь, - это "бесшабашная" парадигма управления, или "обязательно ожидайте, что кто-то замаскирует ваш элемент управления или, по крайней мере, сделает его хорошим в своем сценарии". Пользовательские элементы управления обычно создаются с возможностью повторного использования, часто как части фреймворческих библиотек.

A ControlTemplate - это, по сути, описание замещающего визуального дерева и может быть задано либо явно на FrameworkElements, либо как часть стиля. Это тот вариант, на который вы должны стремиться, когда ваша цель состоит прежде всего в том, чтобы сделать заявку и сделать с ней. Вы можете делать почти что угодно с помощью ControlTemplate визуально, если вы можете правильно получить привязки и триггеры (и возможный содержащий стиль). Все это может быть объявлено как ресурс, используемый повторно, чтобы придать вашему приложению общую тему.

A UserControl - это автономный составной элемент управления, части которого индивидуально редактируются в дизайнере, и лучше всего использовать, если вам нужно увидеть ваши компоненты и управлять ими в дизайнере. С другой стороны, ControlTemplate не будет раскрывать свои компоненты для манипуляций в дизайнере (хотя он будет виден). Обычно вы создаете UserControl для страницы сведений о клиенте или в браузере отображения продукта или в любом случае, когда вы не хотите создавать полномасштабный элемент управления, но хотите получить подробный вид с полной поддержкой дизайнера.

Частным случаем является использование шаблона MVVM. Многие отличные реализации MVVM используют UserControls как Views, а ControlTemplates и Styles - как ресурсы, используемые этими представлениями. Практика MVVM также сводит к минимуму потребность в настраиваемом элементе управления и имеет много других преимуществ.

(Для получения дополнительной информации о MVVM, среди многих других, Google для Джоша Смита, Саши Барбер и Карла Шиффлетта фантастические статьи)

Ответ 2

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

Как вы хотите применить шаблон к классу, этот пользовательский класс должен получить из Control (как это делает UserControl).

Основное преимущество написания собственного класса Control -derived заключается в том, что его шаблон может быть переопределен для других сценариев использования, либо внутри приложения, либо другими пользователями этого типа.

В использовании класса UserControl очень мало накладных расходов. Фактически, если вы посмотрите на него в Reflector.NET, вы увидите, что он вряд ли имеет какой-либо код. В первую очередь UserControl просто переопределяет метаданные для некоторых существующих свойств зависимостей (например, значение по умолчанию FocusableProperty false.)

Если вам не нужно переопределять шаблон элемента управления сразу, вы можете оставить его как UserControl и изменить его позже, если это необходимо.