Вопрос по viewmodel, wpf, wpf-controls, user-controls, custom-controls – Пользовательский и Пользовательский контроль

43

Я читал некоторые пояснения относительно различий между пользовательскими и пользовательскими элементами управления, например: http://www.wpftutorial.net/CustomVsUserControl.html

Я хочу создать, например, простую композицию сетки данных с двумя выпадающими списками, которые отвечают за изменение значений элементов таблицы данных. Я хочу создать конкретный элемент управления для этого, потому что я собираюсь использовать его много раз. Я хотел бы реализовать логику, а затем в вызове xaml мне нужно только указать itemsSource.

Для этого примера я должен создать пользовательский или пользовательский элемент управления? Так как у меня будут свойства и логика, должен ли я иметь модель представления для этого элемента управления?

РЕДАКТИРОВАТЬ: Знаете ли вы некоторые статьи с четким концептуальным разделением между этими двумя вариантами?

@DavidBrunelle определенно нет. Различная обработка шаблона должна прояснить это. Кроме того, UserControl не может иметь стиль, который имеет жизненно важное значение почти для всех пользовательских элементов управления. dowhilefor
Насколько я знаю, пользовательские элементы управления - это просто скомпилированные пользовательские элементы управления (или базовый элемент управления). David Brunelle

Ваш Ответ

8   ответов
-1

Вы всегда можете положиться на самоочевидные описания в стиле Microsoft:

User Control (WPF) - Windows Presentation Foundation user control
Custom Control (WPF) - Windows Presentation Foundation custom control

Ха-ха очень смешно :)
5

If you have a view-model and you wish to create a view for it use the User-Control.

If you need an autonomous control that has no specific view-model,
you probably need a custom-control.

If you find that the functionality you need as whole, already exist in other controls you need to override an existing control template.
(i.e: for a diamond shaped button - you need to override the button control template.)

Regarding attached-properties and attached-behaviors, those are useful when you have a control which you want to extend with more properties or you want it to behave slightly different than its default behavior.

В предоставленном случае композиции, описанной OP, это может быть достигнуто либо с помощью пользовательского элемента управления, либо с помощью пользовательского элемента управления. Я бы предпочел пользовательский элемент управления, поскольку не предоставлена конкретная модель представления, а именно «вход». это только свойство, связанное с коллекцией элементов.

О, и я прошу прощения за немного опоздание.

1

Если вы впервые создаете элементы управления, я рекомендую UserControl, так как VS позволяет вам легче разрабатывать его интерфейс. Пользовательские элементы управления являются более мощными, но вы должны ЯВНО отделить логику элемента управления от его интерфейса, и это требует немного большей подготовки.

77

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

Я иду в следующем порядке рассмотрения

Attached Properties : If functionality can be achieved, I use attached properties. Example, Numeric text box.

Control Template : When requirement can be fulfilled by customizing the control template, I use this. Example, circular progress bar.

Custom control: If control template cannot do it, I use custom control. Provided I need to customize/extend already present control. Example providing Sorting, Filtering based on header row in GridView (GridView is present in metro apps, used just to illustrate the example)

User control: Least preferred one. Only when composition is required, and I am unable to do it using custom control. Like in your example, 2 Combobox, and 1 datagrid. User controls does not provide seamless lookless feature that can be leveraged through custom control or control template.

невежливое поведение - это то, что удерживает меня от контроля пользователя.
я тоже люблю прикрепленное поведение. Они делают код чище, но в то же время я не люблю чрезмерно использовать, когда присоединенные свойства являются достаточными, и не требуют много сантехники
Также обратите внимание, что если позднее вы захотите использовать ваш элемент в качестве контейнера, вам следует избегать использования UserControl, поскольку вы не сможете назначить x: Names его дочерним элементам.More info
+1 Замечательно, я бы переключил CustomControl и UserControl, но в остальном именно так и следует подумать о том, как реализовать свою пользовательскую логику пользовательского интерфейса. На самом деле я всегда вижу CustomControl как последний возможный вариант, и мне нравится выполнять задачи с использованием Attached Behaviors.
7

Лучшее объяснение вMSDN, CustomControl является более "виртуальным" имя, нет класса с именем & quot; CustomControl & quot; в WPF вместо этого подразумевалось создание нового класса на основе одного из классов управления WPF, напримерControl, ItemsControl и даже более конкретные элементы управления, такие какTextBox или жеButton.

Для вашего конкретного случая должно быть достаточно UserControl, а создание CustomControl - это то, чего можно легко избежать. Хотя это неплохо, многие люди, особенно новички в WPF, пришедшие из WinForms, имеют тенденцию создавать подклассы больше, чем необходимо.

33

У вас уже есть отличные ответы, которые объясняют различия, но также понимают, что пользовательские элементы управления иUserControls имеют разные цели:

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

Пользовательский элемент управления - это элемент управления, полученный из одного изWPF контрольные занятия (Е.Г.Control, ContentControl и т. д.) и должен быть создан в коде. Эти меры контроля обычно имеют единуюTextBox, ComboBox, Label) вместо того, чтобы действовать вместе в целом (хотя это не обязательно должно быть так).

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

Мое предложение будет начинаться сUserControl, Вы всегда можете реорганизовать это в пользовательский элемент управления позже, когда вы лучше познакомитесь с тем, какWPF работает. Создание вашего элемента управления в качестве пользовательского элемента управленияwill требовать знанияControlTemplateс иStyleс тем, что вам нужно будет предоставить свой собственный, чтобы определить внешний вид для вашего контроля.

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

Увидетьэтот опубликовать пример двух подходов к одной и той же проблеме. Автор сообщения хотел элемент управления, который может представлять модальное содержимое перед основным содержимым. Автор сообщения фактически ответил на свой вопрос, реализовав его в видеUserControl, Я добавил ответ к сообщению, которое создает элемент управления в качестве пользовательского элемента управления, но оба имеют одинаковый конечный эффект.

1

(Извините за публикацию в качестве ответа, не могу комментировать. Если вы найдете это полезным, не стесняйтесь добавлять это как комментарий, например. Ответ Бенджамина?)

Вы можете легко визуально оформитьCustomControl. Create new UserControl (или Окно). Создайте его структуру xaml визуально в Designer. Скопируйте и вставьте тело полученного xaml внутриControlTemplate вашего новогоCustomControl (Например, в файле общей темы).

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

Конечно, вы также можете создать экземпляр CustomControl в окне и поместить представление конструктора окна в качестве новой панели над представлением элемента управления xaml в VisualStudio. Однако некоторые привязки xaml из шаблона стиля не отображаются в Designer, пока я не перестрою.

[Imho GUI - это, в основном, визуальный материал, и его не нужно и не нужно создавать в коде. ]

0

Чтобы создать пользовательский элемент управления, вам нужно реализовать его как пользовательский элемент управления. Ваш собственный пользовательский элемент управления называется пользовательским элементом управления. Это довольно просто.

UserControl - это базовый класс для хранения вашего пользовательского контента:

<UserControl>
  Your custom WPF content
</UserControl>

Я полностью не согласен с этой статьей. Однако в вашем случае вам нужен UserControl, который вы можете использовать повторно в своем пользовательском интерфейсе.

@MBen Бен снова извините, но это тоже неправильно. ViewModel не обязательно должен быть объектом DependencyObject (обязательным условием для наличия свойств зависимости), ему нужно только реализовать INotifyPropertyChanged.
Спасибо за быстрый ответ. А как насчет опции viewmodel? Я хочу получить XAML настолько простым, насколько это возможно, и я думал просто о том, чтобы иметь одно открытое свойство, которое получало бы идентификатор, который использовался бы для внутренних вызовов бизнес-уровня для получения данных. В этой ситуации для меня имеет смысл иметь модель представления, но я не знаю, потеряю ли я возможность повторного использования. Louro
@dowhilefor Я согласен с тобой. Однако для меня Custom Control - это встроенный элемент управления, который будет использоваться другими разработчиками. Если я правильно понял, это дело Луро. Я согласен с вами, вы можете создать огромное приложение, не используя UserControl. UserControl используется, когда вы особенно хотите стать частью пользовательского интерфейса многократного использования.
@Louro При создании пользовательского элемента управления ваш ViewModel должен быть объектом DependencyObject для объявления свойств Dependency. Свойство зависимости - это то, что вы будете использовать для привязки в XAML. Я хотел бы объявить идентификатор как зависимостьProperty в ViewModel.
@MBen извините, я, возможно, не понимаю ваше первое предложение, но & quot; Чтобы создать пользовательский контроль, вам нужно реализовать его как пользовательский элемент управления & quot ;, это совершенно неправильно, так как CustomControl не имеет ничего общего с UserControl, фактически вы можете написать огромное приложение без каких-либо UserControls. Также & quot; Ваш UserControl называется пользовательским элементом управления & quot; Это также неправильно, UserControl НЕ является CustomControl в первоначальном смысле, подклассы элемента управления WPF, или ваши другие CustomControls называются CustomControl.

Похожие вопросы