是否有可能在WPF中定义多个“键控”样式但具有不同的TargetTypes?

时间:2013-06-12 12:31:27

标签: wpf xaml styles

我正试图掌握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>

2 个答案:

答案 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属性继承和扩展基本样式。