Wpf Can';t设置带有TargetType形状的样式

Wpf Can';t设置带有TargetType形状的样式,wpf,xaml,Wpf,Xaml,我正在尝试使用WPF中的样式为几种形状类型设置属性 <Style.Resources> <Style TargetType="{x:Type Polyline}"> <Setter Property="Stroke" Value="White"/> </Style> <Style TargetType="{x:Type Path}"> <Setter Property="Stroke" Value="W

我正在尝试使用WPF中的样式为几种形状类型设置属性

<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>

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

当WPF搜索隐式
样式时,它会查找其键与要设置样式的元素的
DefaultStyleKey
匹配的资源。WPF中的约定是,每个控件
T
DefaultStyleKey
重写为
typeof(T)
。如果没有找到匹配项,WPF将尝试退回到基类型的样式键

例如,
Ellipse
有一个隐含的[1]默认样式键
typeof(Ellipse)
,因此WPF只会尝试使用该键解析隐含样式;键入
typeof(Shape)
的资源将不被应用

如果要使用隐式样式,则需要为每个具体类型定义隐式
样式。但是,这些样式可以从公共基继承setter和触发器
样式

<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元素不重写
DefaultStyleKey
<代码>形状
及其子类就是其中之一。在这种情况下,WPF采用默认约定。

肯定是一种改进,谢谢!我似乎记得我知道这一点。。。一定是忘了。:)
<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}" />
<Style x:Key="StrokedShape" TargetType="{x:Type Shape}">
    <Setter Property="Stroke" Value="Black"/>
</Style>

<!-- ... -->

<Ellipse Style="{StaticResource StrokedShape}" />