Как правильно наследовать пользовательский элемент управления, определенный в XAML, в Silverlight

Если у меня есть пользовательский элемент управления (в Silverlight), который я написал, который использует XAML для определения его внешнего вида, как я могу создать его индивидуальную версию?

т.е. у меня есть MyControl.xaml и MyControl.xaml.cs

Что мне нужно делать, если мне нужен дочерний класс SpecialisedControl? Я предполагаю, что я просто создаю новый файл кода, а затем наследую от MyControl. Но что, если я хочу изменить внешний вид базового класса - что мне тогда делать?

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

David Mitchell 22.10.2008 18:31

С точки зрения XAML / UserControls довольно много. В любом случае опубликуйте свой ответ, это может помочь :)

Mark Ingram 22.10.2008 18:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
17
2
26 064
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

Если под «изменением внешнего вида базового класса» вы имеете в виду «предоставить новый шаблон», то вам, вероятно, понадобится CustomControl, а не UserControl.

Лучший способ добиться этого - следовать примеру других элементов управления Microsoft, таких как Button или ListBox:

  1. Создайте класс, производный непосредственно от Control (или того, что ближе всего к вашему элементу управления).
  2. Если какие-либо свойства должны быть представлены элементу управления (например, текст на кнопке), убедитесь, что вы правильно определили их как DependencyProperties.
  3. Как описано здесь, создайте ResourceDictionary под названием Themes / generic.xaml и добавьте стиль для вашего класса, который включает шаблон (не давайте стилю ключ).
  4. Используйте TemplateBindings для любых свойств элементов в вашем элементе управления, которым необходимо получать значения из вашего элемента управления.
  5. Если вам нужно прикрепить какие-либо обработчики событий к элементам в вашем шаблоне, дайте им уникальное имя. Microsoft использует соглашение о добавлении к этим именам префикса «PART_», и я думаю, что это хорошо для единообразия, но это не обязательно.
  6. Опять же, если вам нужно присоединить обработчики событий, перегрузите OnApplyTemplate (). В этом методе вы должны отсоединить все старые обработчики событий (нам определенно не нужны утечки памяти!) И искать элементы с именами, указанными вами в вашем шаблоне - когда вы их найдете, при необходимости прикрепите обработчики событий. .

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

С другой стороны, если все, что вы хотите сделать, это предоставить определенную ограниченную настройку, такую ​​как изменение фона или связывание команды с некоторым действием пользователя, то лучше всего предоставить DependencyProperties, которые затем можно установить в стили для вашего элемента управления или на экземплярах самого элемента управления.

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

Не знаю, мне нравится делать что-то с простыми предметами. Вот статья, в которой описывается простой способ вывести созданный XAML элемент управления за пределы иерархии наследования, чтобы вы могли настраивать внешний вид и поведение с помощью SimpleThingsLikeInheritance, а не MicrosoftStuffThatAlmostWorks.

http://gen5.info/q/2009/02/10/subverting-xaml-how-to-inherit-from-silverlight-user-controls/

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

В этом посте я объясню, как вы реализуете эти два метода. http://www.lab101.be/2008/07/silverlight-usercontrol-inheritance/

Как описывает ссылка Михни, самое простое решение - просто добавить пространство имен в ваш XAML:

C#

public class MyBase : UserControl
{
}

public class FirstUserControl : MyBase
{
...
}

XAML

<local:MyBase 
    x:Class = "FirstUserControl" 
    xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:local = "YourAssembly" ...>

    <!-- Sticking with UserControl instead of local:MyBase makes this clearer -->
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                ..
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>

..Your XAML
</local:MyBase>

Неправильный. Если у вас есть базовый пользовательский элемент управления с XAML в нем (как говорится в вопросе), вы не можете использовать наследование: connect.microsoft.com/VisualStudio/feedback/details/289715/…

Ignacio Soler Garcia 08.12.2011 12:35

Другие вопросы по теме