WPF / XAML:使用不同的TargetType设置样式?

时间:2009-08-11 21:05:48

标签: wpf silverlight xaml styles targettype

我在x:Key引用的资源字典中有一个外部样式资源。它有一个x:TargetType指定一个目标(TextBlock)。是否可以将其应用于包含TextBlock的控件并使该控件中的所有TextBlock元素都应用了样式?

谢谢, 罗伯特

4 个答案:

答案 0 :(得分:4)

最简单的方法是在Control中定义一个基于外部样式资源的Style,但不要指定x:Key,只需指定TargetType。

<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource SomeOtherStyle}">

如果没有密钥,它将自动应用于控件中的所有TextBlock。

答案 1 :(得分:1)

要扩展其他评论。当您使用Brandon显示的语法时:

<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource SomeOtherStyle}">

BasedOn =“”基本上是一种风格的“继承”。这种风格的基础设置将是它所基于的风格。这使您能够使用仅适用于此情况的选项来扩充样式,或者根据您的情况需要重新定义样式的范围。

您将字典文件中的样式作为键控样式,只能显式应用。通过“重新定义”您的样式,Brandon现在可以通过省略键来重新定义范围,从而使其适用于该样式范围内的目标类型的所有元素。因此,如果您的所有TextBlock都在Grid中,您可以使用以下内容:

<Grid.Resources>
<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource MyBaseStyle}">                  
</Style>
</Grid.Resources>

答案 2 :(得分:0)

不,但您可以自动将样式应用于特定类型的所有元素,如下所示:

<!-- Applies to all buttons in scope of this style -->
<Style x:Key="{x:Type Button}" TargetType="{x:Type Button}">
   ...
</Style>

答案 3 :(得分:0)

我认为这就是你要找的东西:

您的自定义用户控件“test”:

<UserControl x:Class="WpfApplication4.test"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <Grid>
        <TextBlock>test</TextBlock>
    </Grid>
</UserControl>

您的样式文档“Res / Styles.xaml”

 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="{x:Type TextBlock}">
    <Style.Setters>
        <Setter Property="Foreground" Value="Blue" />
    </Style.Setters>
</Style>

您的主要窗口或父级:

<Window x:Class="WpfApplication4.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:uc="clr-namespace:WpfApplication4"
Title="Window1" Height="300" Width="300">
<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Res/Styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

<Grid>
    <uc:test></uc:test>
</Grid>

自定义控件“test”中的文本块现在显示为蓝色前景。