Я написал это, думая, что вы говорите о WPF, а не о Silverlight, но может быть достаточно совпадений, чтобы это было полезно, поэтому я все равно публикую это.
Если под «изменить внешний вид базового класса» вы подразумеваете «предоставить новый шаблон», то, вероятно, вам нужен CustomControl, а не UserControl.
Лучший способ сделать это - следовать примеру, заданному другими элементами управления Microsoft, такими как Button или ListBox:
- Создайте класс, производный непосредственно от Control (или того, что ближе всего к вашему контролю).
- Если какие-либо свойства должны быть доступны элементу управления (например, текст на кнопке), убедитесь, что вы правильно определили их как DependencyProperties.
- Как описано здесь , создайте ResourceDictionary под названием Themes / generic.xaml и добавьте стиль для своего класса, который включает в себя шаблон (не назначайте стилю ключ).
- Используйте TemplateBindings для любых свойств элементов вашего элемента управления, которым необходимо получить значения из вашего элемента управления.
- Если вам нужно прикрепить какие-либо обработчики событий к элементам в вашем шаблоне, присвойте им уникальное имя. Microsoft использует соглашение, заключающееся в добавлении префиксов к этим именам "PART_", и я думаю, что это хорошо для согласованности, но это не является строго обязательным.
- Опять же, если вам нужно присоединить обработчики событий, перегрузите OnApplyTemplate (). В этом методе вы должны отсоединить любые старые обработчики событий (мы, конечно, не хотим утечек памяти!) И искать элементы с именами, указанными вами в шаблоне - когда вы их найдете, присоедините обработчики событий, если это необходимо .
Это, безусловно, гораздо больше работы, чем просто вывод из UserControl, но если вы хотите иметь возможность полностью повторно шаблонировать элементы управления, как вы можете со встроенными элементами управления, это способ сделать это.
С другой стороны, , если все, что вы хотите сделать, - это обеспечить определенную ограниченную настройку, такую как изменение фона или связывание команды с каким-либо действием пользователя, тогда лучше всего сделать, чтобы выставить DependencyProperties, которые затем могут быть установлены в стилях для вашего элемента управления или на самих экземплярах вашего элемента управления.
В случае, если вы упомянули о желании настроить внешний вид в унаследованном элементе управления, процесс очень похож: просто добавьте стиль по умолчанию для нового элемента управления с новым шаблоном; если вам нужно добавить больше обработчиков событий, просто убедитесь, что вы вызываете base.OnApplyTemplate ().