覆盖WPF中contentpresenter的类型化文本块样式

时间:2011-03-21 17:02:33

标签: wpf templates themes styles textblock

我已经定义了键入的Textblock样式(而不是键值),因此它适用于所有文本块。

<Style TargetType="{x:Type TextBlock}">
        <Setter Property="FontFamily" Value="MyFancyFont"/>
        <Setter Property="FontSize" Value="13.333" />
        <Setter Property="Foreground" Value="Gray" />
</Style>

现在我有一个,例如,TreeViewItem,我想将其显示为蓝色背景,并在选择时显示为深色背景的白色前景。

<!--part of the treeviewitem template-->
<Trigger Property="IsSelected" Value="true">
    <Setter Property="Foreground" Value="White"/>
    <Setter Property="Background" Value="Black"/>
</Trigger>

定义文本块的本地样式不适用于选择树视图项目时的情况,因为项目中的文本块仍在拾取键入的样式。

有没有一种好方法可以做到这一点,同时仍然将文本块样式保持为“已键入”?

1 个答案:

答案 0 :(得分:3)

this问题可能会对您有所帮助。它显示了如何覆盖隐式样式。

好的,我理解你的问题并且我没有真正的直接解决方案,但无论如何我会告诉你我是如何处理这些事情的:

你知道,隐式样式是作用域的,这意味着:

    <Grid>
        <Grid.Resources>
            <Style TargetType="{x:Type TextBlock}">
                <Setter Property="FontFamily" Value="MyFancyFont"/>
            </Style>
        </Grid.Resources>
        <TextBlock>textblock with MyFancyFont</TextBlock>           
    </Grid>
    <TextBlock>textblock with normal font</TextBlock>

我通常会尝试在主窗口的资源中避免使用TextBlock的这种隐式样式。相反,我可能会这样做:

<Application bunch="ofStuff">
    <Application.Resources>
        <Style TargetType="{x:Type TextBlock}" x:Key="TextBlockStandardStyle">
            <Setter Property="FontFamily" Value="MyFancyFont"/>
        </Style>
    </Application.Resources>
</Application>

然后在子区域,这种风格可以隐含,不会造成任何伤害,我会写:

    <Grid>
        <Grid.Resources>
            <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource TextBlockStandardStyle}"/>              
        </Grid.Resources>
        <TextBlock>textblock with MyFancyFont</TextBlock>           
    </Grid>

这样我可以根据自己的需要调整范围。也许这种方法可以让你跳过树视图的隐式样式,这样你就可以使用你的触发器了!