WPF类和相应的视觉样式继承

时间:2012-03-15 16:15:25

标签: wpf inheritance styles themes

我看过,但显然无法在与类和样式相关时获得正确的语法。我有一些具有某些行为的控件。我推导出一些额外的行为。现在,我希望样式与每个版本对应。在最简单的例子中,我将忽略这些类,因为我知道样式与视觉特性和非功能影响特别相关。以前的一些问题很接近,但我仍然遗漏了一些东西。

public class MyLabel : Label
{}

public class MyLabel2 : MyLabel
{}

所以从上面我可以在我的资源字典中有3个样式。一个用于通用“标签”,一个用于我具有从“MyLabel”派生的控件而另一个用于“MyLabel2”的实例。根据“主题”xaml声明,“local:”指向我的类库。

<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 :(得分:0)

好吧,我偶然发现了APPEARS作为答案的工作,但不明白为什么......如果我尝试从

<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:key,它没有被类实例暗示,但没有它,直接类会自动找到它。

扩展我的风格......

所以,这是我发现的一些额外内容。一个样式可以多次定义到相同的TARGET TYPE ...但是,一个可以有一个x:key引用,另一个可以有一个BasedOn引用。这个APPEARS就像重载具有相同数字但不同数据类型参数的函数一样。

在我的问题中,只要将“x:Key”引用添加到样式中,“TargetType”的任何直接类实例都不会自动链接到正确的样式,几乎就像样式声明中的“ x:key“要求类的任何实例在控件的xaml中显式添加样式上下文。那么现在,如何实现这两种方式。我创建了一个以TargetType作为基类的SECOND样式,但是ITs BasedOn指向了x:key引用的样式。这样,我得到了样式的默认自定义,但是仍然可以将它分配给基类和派生类,因此控件的所有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个“类”。