被重写的TextBlock样式的奇怪行为

时间:2012-06-09 18:34:41

标签: c# wpf styles textblock

前几天我遇到了Button内部文本的奇怪行为(我想其他ContentControls的行为也是如此)。让我解释一下情况。我在App.xaml中有一个样式定义用于TextBlock:

<Application.Resources>
    <Style TargetType="{x:Type TextBlock}">
        <Setter Property="Margin" Value="10"/>
    </Style>
</Application.Resources>

在MainWindow.xaml中,我有相同的样式定义,它应该覆盖在App.xaml中定义的样式。我在Window中有3个按钮。在第一个按钮中明确定义了TextBlock控件里面按钮的内容。对于第二个按钮,我将字符串设置为代码隐藏中的内容。对于第三个按钮,我将整数值设置为代码隐藏中的内容。这是MainWindow.xaml的代码:

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Margin" Value="0"/>
        </Style>
    </StackPanel.Resources>
    <Button Name="Button1">
        <Button.Content>
            <TextBlock Text="Button with text block"/>
        </Button.Content>
    </Button>
    <Button Name="Button2" />
    <Button Name="Button3" />
</StackPanel>

和MainWindow.xaml.cs:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    Button2.Content = "Button with string";
    Button3.Content = 16;
}

现在我们看到了什么?正如预期的那样,第一个和第三个按钮中的文本边距为0px,但第二个按钮中的文本边距为10px!问题是:为什么第二个按钮具有10px边距以及如何为第二个按钮设置零边距(从App.xaml中删除样式是不可能的)?

谢谢!

2 个答案:

答案 0 :(得分:2)

当我改变

Button2.Content = "Button with string"; 

Button2.Content = "Button with _string"; 

按钮的边距从10变为0.

这是WPF中的一个错误;它已在Microsoft Connect上报告。

我不是100%肯定,但我认为你看到的行为是由同样的根本原因造成的。

顺便说一句:正确的行为是按钮2和3的Margin = 10;这是因为资源查找是沿着逻辑树而不是沿着可视树执行的。按钮2和3中的TextBlocks不在StackPanel的逻辑树中。

答案 1 :(得分:0)

我不能给你一个确定的答案,但我注意到设置一个字符串和一个导致应用不同样式的整数之间的区别。

由于将内容设置为需要转换的值会导致应用正确的样式,因此我尝试了这样做:

private void WindowLoaded(object sender, RoutedEventArgs e)
{
    Button2.Content = new TextHolder("Button with string");
    Button3.Content = 16;
}

public class TextHolder
{
    private readonly string _text;

    public TextHolder(string text)
    {
        _text = text;
    }

    public override string ToString()
    {
        return _text;
    }
}

,保证金现在为0.我有兴趣了解到底发生了什么。