#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. Вы правы, что «плохо» писать поведение / последовательность дважды, но представления разные, поэтому вы не нарушаете никакого повторного использования там.