Класс WPF и соответствующее наследование визуального стиля - PullRequest
0 голосов
/ 15 марта 2012

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

public class MyLabel : Label
{}

public class MyLabel2 : MyLabel
{}

Так что из вышесказанного я должен иметь три стиля в своем словаре ресурсов.Один для общей метки, один для случаев, когда у меня есть элемент управления, производный от «MyLabel», а другой для «MyLabel2».«Local:» указывает на мою библиотеку классов в соответствии с объявлением xaml «Theme».

<Style x:Key="baseLabel" TargetType="Label">
   <Setter Property="FontSize" Value="10" />
</Style>

<Style x:Key="styleMyLabel" TargetType="local:MyLabel"  BasedOn="{StaticResource baseLabel}" >
   <Setter Property="FontSize" Value="14" />
</Style>

<Style x:Key="styleMyLabel2" TargetType="{x:Type local:MyLabel2}" BasedOn="{StaticResource styleMyLabel}" >
   <Setter Property="FontSize" Value="22" />
</Style>

Опять же, для очень упрощенных целей, просто используя простой ярлык для наследования в следующих целях.В моем окне XAML файл.В соответствии с окном xaml, «src:» указывает на мою библиотеку классов, которая является той же библиотекой, что и «local:», на которую ссылается тема (но я пробовал оба способа ... чтобы оба экземпляра ссылались на xmlns: local inи то и другое, но, похоже, это не имело значения).

<src:MyLabel Content="Does Not Respect Style even though derived from MyLabel class" />
<src:MyLabel Content="This one works " Style="{DynamicResource styleMyLabel}" />

<src:MyLabel2 Content="This one doesnt work"/>
<src:MyLabel2 Content="This one works " Style="{DynamicResource styleMyLabel2}" />

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

1 Ответ

0 голосов
/ 16 марта 2012

Хорошо, я наткнулся на то, что ЯВЛЯЕТСЯ работать в качестве ответа, но не понимаю почему ... Если я попытаюсь изменить стиль для MyLabel2 (который является вторым производным экземпляром) с

<Style x:Key="styleMyLabel2" TargetType="{x:Type local:MyLabel2}" BasedOn="{StaticResource styleMyLabel}" >
   <Setter Property="FontSize" Value="22" />
</Style>

to (просто удаляя элемент x: Key)

<Style TargetType="{x:Type local:MyLabel2}" BasedOn="{StaticResource styleMyLabel}" >
   <Setter Property="FontSize" Value="22" />
</Style>

XAML работает ... БЕЗ необходимости явно связывать «Стиль», который будет использоваться.Он находит его непосредственно на основе ассоциации классов.

<src:MyLabel2 Content="Now Works as expected"/>

Теперь, когда он работает, может кто-нибудь объяснить, почему это лишает его использование ссылки x: Key?то есть: если у вас есть ключ x: он не подразумевается экземпляром класса, но не имеет его, прямой класс находит его автоматически.

РАСШИРЕНО ИЗ МОЕЙ ИГРЫ В СТИЛЕ ...

Итак, вот некоторые дополнения, которые я узнал.Стиль может быть определен более одного раза для одного и того же TARGET TYPE ... Однако один может иметь ссылку x: key, а другой - ссылку BasedOn.Это похоже на перегрузку функции с тем же номером, но с разными параметрами типа данных.

В моей проблеме, как только в стиль была добавлена ​​ссылка "x: Key", любые прямые экземпляры класса«TargetType» НЕ был автоматически связан с правильным стилем, почти как объявление стиля с помощью «x: key», ТРЕБУЕТ любых экземпляров класса, чтобы явно добавить контекст стиля в xaml элемента управления.Так что теперь, как это сделать обоими способами.Я создал SECOND стиль с TargetType в качестве базового класса, но ITs BasedOn указывал на ссылку x: ссылается на один.Таким образом, я получаю настройку стиля по умолчанию, но могу по-прежнему назначать его базовому классу и производному классу, так что все 3 версии элемента управления могут автоматически синхронизироваться с соответствующим стилем без ссылки EXPLICIT.

<Style TargetType="Label" x:Key="wpfBaseLabel">
   <Setter Property="FontSize" Value="11" />
</Style>

<Style TargetType="Label" BasedOn="{StaticResource wpfBaseLabel}" />

<Style TargetType="{x:Type local:MyLabel}" BasedOn="{StaticResource wpfBaseLabel}">
   <Setter Property="Foreground" Value="Blue" />
</Style>

Итак, теперь, в окончательном XAML, я могу использовать все 3 «класса» с явной ассоциацией стилей или без нее.

...