0

我正在尝试掌握 WPF 样式。

我想知道是否可以定义一个Style键,然后描述它应该如何应用于不同的TargetTypes.

这种方法对我不起作用。我收到一条错误消息说"TargetType 'TextBlock'" does not match the Element "Image".'

似乎很奇怪,每种样式:类型组合都需要它自己的键名。我做错了什么?这完全是错误的方法吗?

例如在 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>
4

2 回答 2

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(不是从 Control 派生的)共享该样式,但您可以创建一个样式,其中在这种情况下,TargetType 是 Control。您甚至可以将该样式的 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}" />
于 2013-06-12T12:53:21.813 回答
0

简短地回答你的问题..你不能!

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

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

于 2013-06-12T12:39:01.963 回答