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

Я думаю, что это потому, что троичная операция не является правильной в первом, и она не набирает начальное значение. Вместо сложения (+) используйте + = на аккумуляторе.

let a = 1, b = 2
let c = 0

c + a === 1 ? a : b //  fails, c = 0

c += a === 1 ? a : b //  success, c = 1

17
задан Mark Ingram 22 October 2008 в 14:54
поделиться

4 ответа

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

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

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

  1. Создают класс, который происходит непосредственно из Управления (или независимо от того, что является самым близким к Вашему управлению).
  2. , Если какие-либо свойства должны будут быть представлены управлению (такому как текст на кнопке, например), удостоверяются, что Вы правильно определяете их как DependencyProperties.
  3. , Как описано здесь , создайте ResourceDictionary по имени Themes/generic.xaml и добавьте стиль для своего класса, который включает шаблон (не давайте стилю ключ).
  4. Использование TemplateBindings для любых свойств элементов на Вашем управлении, которое должно получить значения от Вашего управления.
  5. , Если необходимо будет присоединить какие-либо обработчики событий к элементам в шаблоне, дайте им уникальное имя. Microsoft использует соглашение добавления префикса этих имен с "ЧАСТЬЮ _", и я думаю, что это - хорошая вещь сделать ради непротиворечивости, но это строго не требуется.
  6. Снова, если необходимо присоединить обработчики событий, перегрузка OnApplyTemplate (). В этом методе необходимо отсоединить любые старые обработчики событий (мы, конечно, не хотим утечек памяти!), и ищут элементы, которые имеют имена Ваш обеспеченный в Вашем шаблоне - когда Вы находите их, присоединяете обработчики событий по мере необходимости.

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

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

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

8
ответ дан 30 November 2019 в 14:01
поделиться

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

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

5
ответ дан 30 November 2019 в 14:01
поделиться

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

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

0
ответ дан 30 November 2019 в 14:01
поделиться

Как описано в ссылке Михни, самое простое решение - просто добавить пространство имен в ваш 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>
5
ответ дан 30 November 2019 в 14:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: