无法使用TargetType Shape设置样式

时间:2017-09-14 12:53:18

标签: wpf xaml

我正在尝试使用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>

有没有比我列出的第一个选项更好的方法?

1 个答案:

答案 0 :(得分:2)

当WPF搜索隐式Style时,它会查找其键与要设置样式的元素的DefaultStyleKey匹配的资源。 WPF中的约定是每个控件T都会覆盖DefaultStyleKeytypeof(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 采用默认约定。