无法覆盖XAML中的TextBlock样式

时间:2013-09-13 13:47:18

标签: c# wpf xaml propertygrid templatebinding

我在ResourceDictionary中有这个,在应用程序级别定义一个样式:

<Style x:Key="TextBlockStyle" TargetType="TextBlock">
    <Setter Property="Margin" Value="0,10,0,10"/>
</Style>
<Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle}" />

我想删除特定TextBlock的边距,该边框位于xctk:PropertyGrid控件内(来自Extended WPF Toolkit)。如果我只是更改上面的ResourceDictionary样式中的数字,它就可以工作。

现在我试图在特定窗口XAML中覆盖PropertyGrid的样式而不是全局样式。

<xctk:PropertyGrid>
    <xctk:PropertyGrid.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Margin" Value="0,0,0,0"/>
        </Style>
    </xctk:PropertyGrid.Resources>
</xctk:PropertyGrid>

不幸的是,这不起作用,PropertyGrid中的TextBlock保持不变,保持全局风格。

更新:

xtck:PropertyGrid里面有一个xctk:WatermarkTextBox。 WatermarkTextBox里面有这个:

<ContentPresenter x:Name="PART_WatermarkHost" Content="{TemplateBinding Watermark}"
    ContentTemplate="{TemplateBinding WatermarkTemplate}"
    VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
    HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
    isHitTestVisible="False"
    Margin="{TemplateBinding Padding}"
    Visibility="Collapsed" />

正是这个ContentPresenter,它显然产生了有问题的TextBlock。

  1. ResourceDictionary中的样式会应用于它,从而更改边距。

  2. 但我的内心风格并没有覆盖它。

  3. 我该怎么做?

1 个答案:

答案 0 :(得分:1)

我刚刚进行了多项测试,但我无法重现您的问题。我放入Style部分的任何UIElement.Resources与我放入Style部分的App.Resources的工作方式相同。

如果UIElement直接或在其自己的UIElement.Style中设置了属性,那么尝试将同一属性设置为另一个Style中的其他值只是不起作用。无论定义Style的位置如何,都是如此。

确实确保更改Margin部分实际中的App.Resources值有所不同吗?尝试将Background属性设置为红色或其他可以100%确定的属性。

顺便提一下,你可能已经知道了这一点,但是如果你想设置一个具有四个相同值的Margin属性,你可以只设置一个这样的值:

<TextBlock Text="Something" Margin="0" />

更新&gt;&gt;&gt;

@Andrew,看看你添加的XAML ......我认为那里是你的答案......看看以下一行:

Margin="{TemplateBinding Padding}"

Margin属性实际上是根据模板父级的Padding值设置的,因此请尝试设置Padding属性。 应该链接到TextBox.Margin