Расширение пользовательских элементов управления в WPF - PullRequest
9 голосов
/ 20 ноября 2011

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

Моей первой идеей было создание интерфейса, объединяющего общие функции двух типов элементов управления.Это правильный путь?И как бы я управлял различными частями XAML, которые я должен был иметь?Любой совет приветствуется.

Ответы [ 3 ]

8 голосов
/ 23 ноября 2011

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

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

<UserControl> ... </UserControl>

У вас будет

<MyProject: MyBaseControl x:Class="MyProject.MyExtendedControl"> ... </MyProject: MyBaseControl>

, а затем в указанном коде вам также необходимо указать следующее:

class MyExtendedControl : MyBaseControl

Надеюсь, это поможет.

2 голосов
/ 20 ноября 2011

Есть несколько способов разделить части, чтобы с ними было легче работать.

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

Еще один способ разделить функциональность - агрегация. См. StackOverflow 269496

Вы можете создавать меньшие элементы управления, которые реализуют общие функциональные возможности, а затем создавать большие элементы управления специального назначения, комбинируя меньшие элементы управления (то есть объединяя их) для создания большего элемента управления. Агрегация будет работать как для подхода с выделенным кодом, так и для привязки данных.

2 голосов
/ 20 ноября 2011

Пользовательские элементы управления плохо поддаются наследованию в WPF, вы можете сделать несколько хаков, чтобы заставить его работать, но в целом вам, вероятно, будет лучше использовать пользовательский элемент управления.С помощью этой техники проще указать разные XAML для унаследованных элементов управления.Самый простой способ начать работу с пользовательским элементом управления - это добавить в проект новый элемент типа «Пользовательский элемент управления (WPF)», и он добавит элемент управления, и XAML будет добавлен в Themes / generic.xaml для вас.

Чтобы унаследовать от этого элемента управления, проще всего добавить еще один новый пользовательский элемент управления (WPF), а затем изменить код для наследования от родительского элемента управления вместо элемента управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...