Если у меня есть пользовательский элемент управления (в Silverlight), который я написал, который использует XAML для определения его внешнего вида, как я могу создать его индивидуальную версию?
т.е. у меня есть MyControl.xaml и MyControl.xaml.cs
Что мне нужно делать, если мне нужен дочерний класс SpecialisedControl? Я предполагаю, что я просто создаю новый файл кода, а затем наследую от MyControl. Но что, если я хочу изменить внешний вид базового класса - что мне тогда делать?
С точки зрения XAML / UserControls довольно много. В любом случае опубликуйте свой ответ, это может помочь :)





Я написал это, думая, что вы говорите о WPF, а не о Silverlight, но может быть достаточно совпадений, чтобы это было полезно, поэтому я все равно публикую его.
Если под «изменением внешнего вида базового класса» вы имеете в виду «предоставить новый шаблон», то вам, вероятно, понадобится CustomControl, а не UserControl.
Лучший способ добиться этого - следовать примеру других элементов управления Microsoft, таких как Button или ListBox:
Это, безусловно, гораздо больше работы, чем просто получение из 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:
public class MyBase : UserControl
{
}
public class FirstUserControl : MyBase
{
...
}
<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/…
Было бы разумно сказать что-нибудь о Silverlight в самом вопросе. Я просто набрал огромный ответ на это, предполагая, что вы говорите о WPF, а затем понял, что вы спрашиваете о Silverlight, и что я не знаю, сколько существует пересечения между ними.