我正在尝试使用WPF中的样式为多个形状类型设置Shape.Stroke
属性。
<Style.Resources>
<Style TargetType="{x:Type Polyline}">
<Setter Property="Stroke" Value="White"/>
</Style>
<Style TargetType="{x:Type Path}">
<Setter Property="Stroke" Value="White"/>
</Style>
<Style TargetType="{x:Type Ellipse}">
<Setter Property="Stroke" Value="White"/>
</Style>
...
</Style.Resources>
似乎不可能只为基类Shape
设置样式。
<Style.Resources>
<Style TargetType="{x:Type Shape}">
<Setter Property="Stroke" Value="White"/>
</Style>
</Style.Resources>
有没有比我列出的第一个选项更好的方法?
答案 0 :(得分:2)
当WPF搜索隐式Style
时,它会查找其键与要设置样式的元素的DefaultStyleKey
匹配的资源。 WPF中的约定是每个控件T
都会覆盖DefaultStyleKey
为typeof(T)
。如果找不到匹配项,WPF将不尝试回退到基本类型的样式键。
Ellipse
具有隐含的 [1] 默认样式键typeof(Ellipse)
,因此WPF将仅尝试使用该键解析隐式样式; <{1}}上键入的资源将不会被应用。
如果要使用隐式样式,则需要为每种具体类型定义隐式typeof(Shape)
。但是,这些样式可以从公共基础Style
继承setter和触发器:
Style
请注意,虽然基本类型的隐式样式不会自动应用,但它们仍然兼容,并且可以明确地应用 :
<Style x:Key="x" TargetType="{x:Type Shape}">
<Setter Property="Stroke" Value="Black"/>
</Style>
<Style TargetType="Ellipse" BasedOn="{StaticResource x}" />
<Style TargetType="Path" BasedOn="{StaticResource x}" />
<Style TargetType="Polyline" BasedOn="{StaticResource x}" />
[1] 某些WPF元素不会覆盖<Style x:Key="StrokedShape" TargetType="{x:Type Shape}">
<Setter Property="Stroke" Value="Black"/>
</Style>
<!-- ... -->
<Ellipse Style="{StaticResource StrokedShape}" />
。 DefaultStyleKey
及其子类就在其中。在这种情况下,WPF 采用默认约定。