Wpf Can';t设置带有TargetType形状的样式
我正在尝试使用WPF中的样式为几种形状类型设置属性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
<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}" />