在WPF中是否可以定义多个';键控'-但是有不同的目标类型?

在WPF中是否可以定义多个';键控'-但是有不同的目标类型?,wpf,xaml,styles,Wpf,Xaml,Styles,我正在努力掌握WPF风格 我想知道是否可以定义一个样式键,然后描述如何将其应用于不同的目标类型 这种方法对我不起作用。我收到一条错误消息,指出“TargetType'TextBlock'”与元素“Image”不匹配。 似乎很奇怪,每个样式:类型组合都需要自己的键名。我做错了什么?这完全是错误的做法吗 e、 g.在Window.xaml中: <TabControl TabStripPlacement="Bottom"> <TabItem Content="{Binding

我正在努力掌握WPF风格

我想知道是否可以定义一个
样式
键,然后描述如何将其应用于不同的
目标类型

这种方法对我不起作用。我收到一条错误消息,指出
“TargetType'TextBlock'”与元素“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>

简短回答您的问题。。你不能

您正在将TabHdr样式指定给TextBlock,但该样式定义为图像控件样式。你不能那样做。 如果所有控件都必须具有特定样式,则可以定义不带键但具有特定TargetType的样式。例如,在您提供的代码中,TextBlock应用于所有TextBlock

PS:如果您必须为应用程序创建一种主题,您可以使用BasedOn属性继承和扩展基本样式。

如果您计划按原样显式设置样式,则可以这样做(即,它们是键控样式-隐式样式总是使用类的确切类型找到)。只需将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>

注意:但是,如果您想设置背景(在控件上定义)之类的样式,则您将无法与Image/TextBlock(不是从控件派生的)共享该样式,但在这种情况下,您可以在TargetType为控件的情况下创建样式。您甚至可以将该样式的BasedOn设置为FrameworkElement的样式,以便仍然可以共享其他设置。例如

<Style x:Key="ctrl" TargetType="Control" BasedOn="{StaticResource TabHdr}">
  <Setter Property="Background" Value="Red" />
</Style>

然后在多个控件上使用它。例如

<TextBox Style="{StaticResource ctrl}" />
<Button Content="Foo" Style="{StaticResource ctrl}" />


TargetType
是一个“限定符”,而
x:Key
是一个标识符。当样式未指定标识符但具有
TargetType
时,它将应用于所有“符合”该样式的控件。当指定标识符时,它是独占的。它们不是并行工作的东西。它们有不同的用途。谢谢。我明白你的意思。但是,这些样式并不常见。e、 g.图像上的边距可能/与文本块上的边距不同。看起来我必须使用不同的键…如果要设置的属性不同,那么除了创建不同的样式之外,您别无选择。如果您想要设置的属性相同,但是值不同,那么您可以使用不同的样式,或者将值设置为提供样式的绑定,但是对于类型,我认为使用不同的样式会更干净。