我正试图掌握WPF样式。
我想知道是否可以定义一个Style
密钥,然后描述它应该如何应用于不同的TargetTypes
。
这种方法对我不起作用。我收到一条错误消息,说"TargetType 'TextBlock'" does not match the Element "Image".'
每个样式:类型组合都需要它自己的密钥名称,这似乎很奇怪。我做错了什么?这完全是错误的做法吗?
e.g。在Window.xaml中:
<TabControl TabStripPlacement="Bottom">
<TabItem Content="{Binding UserContent}">
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<Image Source="users_24.gif" Style="{StaticResource TabHdr}"/>
<TextBlock Text="{x:Static r:Messages.Tab_Users}" Style="{StaticResource TabHdr}"/>
</StackPanel>
</TabItem.Header>
</TabItem>
</TabControl>
并在Resources.xaml
中<Style x:Key="TabHdr" TargetType="{x:Type Image}">
<Setter Property="Width" Value="20"/>
<Setter Property="Height" Value="20"/>
<Setter Property="Margin" Value="2, 1, 2, 1"/>
</Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Margin" Value="5, 1, 1, 1"/>
</Style>
答案 0 :(得分:2)
你可以这样做如果你计划明确地设置样式(即它们是键控样式 - 总是使用类的确切类型找到隐式样式)。您只需将 TargetType 设置为定义所有您设置的依赖项属性的最低基类型。因此,在您的情况下,您要设置在FrameworkElement上定义的属性,以便您可以将TargetType设置为 FrameworkElement 。
<Style x:Key="TabHdr" TargetType="FrameworkElement">
<Setter Property="Width" Value="20"/>
<Setter Property="Height" Value="20"/>
<Setter Property="Margin" Value="2, 1, 2, 1"/>
</Style>
注意:如果您想设置类似Background(在Control上定义)的内容,那么您将无法与Image / TextBlock共享该样式(它不是从控制)但是你可以在这种情况下创建一个TargetType为Control的样式。您甚至可以将该样式的BasedOn设置为FrameworkElement的样式,这样您仍然可以共享其他设置。 E.g。
<Style x:Key="ctrl" TargetType="Control" BasedOn="{StaticResource TabHdr}">
<Setter Property="Background" Value="Red" />
</Style>
然后在多个控件上使用它。 E.g。
<TextBox Style="{StaticResource ctrl}" />
<Button Content="Foo" Style="{StaticResource ctrl}" />
答案 1 :(得分:0)
简短回答你的问题......你做不到!
您正在将TabHdr样式指定给TextBlock,但样式被定义为图像控件样式。你不能这样做。 如果您的所有控件都必须具有特定样式,则可以定义没有键但具有特定TargetType的样式。例如,在您提供的代码中,TextBlock将应用于所有TextBlock。
PS:如果必须为应用程序创建一种主题,则可以使用BasedOn属性继承和扩展基本样式。