覆盖TextBlock样式的奇怪行为

4

前些日子,我遇到了一个奇怪的问题,就是在按钮(我猜其他内容控件也会有同样的问题)中的文本表现异常。让我来解释一下这个情况。我在 App.xaml 中定义了 TextBlock 的样式:

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

在MainWindow.xaml文件中,我有一个相同的样式定义,它应该覆盖在App.xaml中定义的样式。此外,我在窗口中有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;
}

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

谢谢!


snoop揭示了什么? - Kent Boogaart
我已经尝试了你的代码:Snoop说第二个TextBlock的Margin=10,而其他的TextBlock的Margin=0。在所有三种情况下,值源都是样式。目前,我不知道是什么原因导致了这种差异。 - user128300
2个回答

2
当我更改时
Button2.Content = "Button with string"; 

to

Button2.Content = "Button with _string"; 

这是WPF中的一个bug;已经在Microsoft Connect上报告过了。

我不确定,但我认为你看到的行为是由同一根本原因引起的。

顺便说一下:正确的行为应该是按钮2和3具有Margin = 10;这是因为资源查找沿着逻辑树进行,而不是沿着视觉树进行。按钮2和3中的TextBlock不在StackPanel的逻辑树内。


0

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

由于将Content设置为需要转换的值会导致正确的样式被应用,因此我尝试了这个方法:

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。我很想了解究竟发生了什么。


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