2012-03-15 2 views
0

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

public class MyLabel : Label 
{} 

public class MyLabel2 : MyLabel 
{} 

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

<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}" /> 

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

ответ

0

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

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

к (только удалением х: ключевой элемент)

<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: его не подразумевает экземпляр класса, но он не имеет его, прямой класс DOES находит его автоматически.

EXPANDED ОТ МОЕГО играть с МОД ...

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

В моей проблеме, как только в стиль добавлена ​​ссылка «x: Key», любые экземпляры прямого класса «TargetType» НЕ были автоматически связаны с соответствующим стилем, почти как объявление стиля с помощью «x: key» ТРЕБУЕТ любые экземпляры класса, чтобы явно добавить контекст стиля в xaml элемента управления. Итак, теперь, как это сделать. Я создал стиль SECOND с TargetType в качестве базового класса, но имел ITs BasedOn, указывающий на ссылку x :. Таким образом, я получаю стандартную настройку стиля, но STILL может назначить его также базовому классу и производному классу, поэтому все 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 «классы», используемые с или без явного объединения стиля.

Смежные вопросы