WPF: Можно ли использовать стили для форматирования пользовательского элемента управления для двух разных сценариев?

#wpf #user-interface #user-controls #styles #maintainability

#wpf #пользовательский интерфейс #пользовательские элементы управления #стили #удобство обслуживания

Вопрос:

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

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

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

Ответ №1:

Конечно, вы можете сделать это со стилями / шаблонами. Просто дайте каждому из стилей ключ и используйте ключ для доступа к нужному стилю в нужном месте:

 <YourUserControl Style="{StaticResource firstStyle}"/>
  

Комментарии:

1. Это ему не поможет. Он хочет, чтобы некоторые значения setter были настроены на основе размещения UserControl, для чего ему нужна некоторая модификация в его стиле.

2. Я не думаю, что мне нужно основывать это на размещении UserControl, скорее я могу поступить так, как рекомендует Деннис, и установить другой стиль для каждого экземпляра моего элемента управления. Но что меня смущает, так это то, как установить расположение элементов управления на основе стиля.

Ответ №2:

Если вы используете шаблон, подобный MVVM (я предпочитаю MVVM Light), это довольно просто сделать. Вы бы написали одну ViewModel, которая фиксировала бы все данные и поведение, которые вы хотели предоставить, а затем создали бы два вида так, как вы хотите, используя одну и ту же модель представления.

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