ContentPresenter内的样式未被应用

4

我有以下的 XAML 代码:

<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="True">
    <DataGrid.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="DataGridCell">
                        <Grid>
                            <ContentPresenter Height="50">
                                <ContentPresenter.Resources>
                                    <Style TargetType="TextBlock">
                                        <Setter Property="Padding" Value="4"/>
                                    </Style>
                                </ContentPresenter.Resources>
                            </ContentPresenter>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGrid.CellStyle>
</DataGrid>

原来TextBlock有一个默认的内边距为2,0。
为什么样式没有被应用呢?
编辑:我使用了这个解决方案(来自这里),它会从自动生成的TextBlock中获取文本(Content.Text),并在另一个TextBlock中显示它。
<ControlTemplate TargetType="{x:Type DataGridCell}">
    <Grid SnapsToDevicePixels="True">
        <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, 
                                  Path=Content.Text}" Padding="4"/>
    </Grid>
</ControlTemplate>

1
为什么不在单元格模板中放置一个实际的TextBlock,并将其Padding设置为4? - Pieter Witvoet
你的想法使用一个包含ContentPresenter的ContainerVisual来渲染Textblock,这有点不寻常。而且只有在使用Margin而不是Padding时才能实现这个想法。 - Gerard
1个回答

4
隐式样式应用于从 Control 继承的元素和未从 Control 继承的 TextBlock 中的元素。
要了解更多信息,请阅读此文章: MSDN Blog 更新答案: 根据 @JustinXL 提到的观点并在我窥视 DataGrid 后,在此范围内,模板不应失去样式,并且我发现本地样式已设置为 TextBlock(由 DataGrid 生成),覆盖了隐式样式。

这不是正确的。TextBlock 可以使用隐式样式进行设置。 - Justin XL
@JustinXL,正如我之前所提到的,这不是在数据模板中。这种行为是有意设计的。 - Reza ArabQaeni
还有我找到的这个答案也提到了这一点:https://dev59.com/7XE95IYBdhLWcg3wDpmg#2479695 - Reza ArabQaeni
我知道,但他的情况不同。他在ContentPresenter内定义了隐式样式,这使得TextBlock和隐式样式处于同一作用域。我只能猜测还有其他东西(另一个命名为TextBlock的样式)覆盖了隐式样式。 - Justin XL
1
@JustinXL,你说得对,在这个作用域中,模板不应该失去样式。我窥探了DataGrid,并发现一个本地样式设置为TextBlock(由DataGrid生成),它覆盖了隐式样式。感谢您的关注。 - Reza ArabQaeni
不用谢。 :) 这是个好发现,或许可以更新你的答案? - Justin XL

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