WPF样式选择器中的TargetType指定嵌套目标类型

3
我该如何指定 FlowDocument 中表格内的所有段落标签(不包括表格外的标签)?我期望的代码如下所示:
<Style TargetType="Table">
    <Style TargetType="Paragraph">
        <Setter Property="Margin" Value="0" />
    <Style>
</Style>

然而,嵌套样式不允许这样写。

在CSS中实现我想要的效果,相当于:

Table Paragraph {margin:0}

在表格的范围内,所有段落标记都应该有0的边距。这在WPF(XAML标记部分)中是否可行?欢迎提供复杂的WPF样式选择器的良好资源。
我可以编写代码来完成此操作,但这不是我要寻找的内容。

1
如果更好的答案被采纳,我会点赞这个问题。 - Guge
@Guge 嗯,尽管这是一个更好的答案,但我不认为取消接受之前的答案会更优雅。它确实回答了我的问题,而更好的答案是半年后才出现的。它最终会被投票支持,那么为什么要贬低原始回答者的分数呢?只需投票支持更好的答案(我也给了它一个赞),它最终会排在顶部。及时帮助(或尝试帮助)也值得得到积分,我不认为在半年后收回奖励是感激、有益或有动力的。 - Louis Somers
即使第一个答案是错误的,也不能返回吗? - Guge
1
@LouisSomers,感谢你的想法,但是...你故意把一个好答案藏在一个坏答案下面。这个网站的目标不是为了获取声望(或者不应该是),而是为了创建一个对他人有用的知识库。另外...如果你担心声望,Sheridan已经有四万多了,Nate的声望也是两位数。我来这里是为了寻找答案,差点错过了它。幸运的是,我滚动了足够的页面才看到正确的答案,但这也促使我发表了这个评论。无论如何,感谢你提出问题并节省了我的时间,+1。 - Basic
好的,你们说得对。我接受了正确的答案。我认为当它获得足够的赞时,它会自然而然地排在最前面,但显然情况并非如此。如果在授予后有更好的东西出现,那么把它收回似乎有点不忠诚或反原则。不管怎样,在这种情况下,我想这样做是正确的,而不是让其他人走上错误的道路。 - Louis Somers
2个回答

11

实际上,可以通过创建一个样式,然后将一个或多个样式包含在Style.Resources属性内来执行类似于CSS的样式嵌套,就像这样:

    <Style TargetType="Table">
        <Style.Resources>
            <Style TargetType="Paragraph">
                <Setter Property="Padding" Value="0" />
            </Style>
        </Style.Resources>
    </Style>

这种样式将应用于所有范围内的表格,并且嵌套的段落样式将应用于所有那些表格内部的段落,但不会应用于表格外部的段落。这是因为将东西放在资源属性中,基本上将它们注入到所有子对象的可见性范围内。

您还可以从技术上讲,进行多级嵌套,以使只在表格内部的段落内的超链接变成绿色,例如:只在表格内的段落内的超链接变成绿色:

    <Style TargetType="Table">
        <Style.Resources>
            <Style TargetType="Paragraph">
                <Setter Property="Padding" Value="0" />
                <Style.Resources>
                    <Style TargetType="Hyperlink">
                        <Setter Property="Foreground" Value="Green" />
                    </Style>
                </Style.Resources>
            </Style>
        </Style.Resources>
    </Style>

2
这是一个更好的答案。 - Guge

3

很遗憾,WPF与CSS的工作方式不完全相同。你仍然可以得到想要的效果,只是没有那么简单。您需要为Style命名,并将其手动应用于希望受影响的任何Paragraph元素:

<Style x:Key="NoSPaceParagraph" TargetType="Paragraph">
    <Setter Property="Margin" Value="0" />
</Style>

...

<Paragraph Style="{StaticResource NoSPaceParagraph}">
    ....
</Paragraph>

好吧,那我就只能接受这个了。我只需要静态地指定Margin="0",因为这比应用样式更简短,而且现在这是我唯一想要的东西。 - Louis Somers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接