【问题标题】:Override typed textblock style for contentpresenter in WPF覆盖 WPF 中 contentpresenter 的类型化文本块样式
【发布时间】:2011-03-21 17:02:32
【问题描述】:

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

<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>

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

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

【问题讨论】:

    标签: wpf templates themes styles textblock


    【解决方案1】:

    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>
    

    这样我就可以按照自己的意愿确定范围。也许这种方法可以让您跳过树视图的隐式样式,以便您可以使用触发器!

    【讨论】:

    • 感谢您的链接。我正在尝试按照它所说的去做,但它似乎不起作用。就我而言,我不确定 treeviewitem 是否为类型字符串生成模板。我认为默认模板在网格内有一个图标、一个内容展示器和一个项目展示器......
    • 所以基本上如果我像这样直接设置标题: 帖子中描述的数据模板有效。当我为标题指定字符串以外的其他内容时,它不起作用,例如图标的图像加上一些文本。如果项目有子项目(标题字符串旁边有一个“加号”),它也不起作用。
    • @mobileTofu here 是您绝对应该查看的链接。通过提供的答案,您可以在 TreeViewStyle 的资源中设置样式,您可以在其中将前景属性重新定义为该相对源绑定
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多