4

数日前、Button内のテキストの奇妙な動作に直面しました(他のContentControlsで得たのと同じ動作だと思います)。状況を説明させてください。App.xamlにTextBlockのスタイル定義があります。

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

MainWindow.xamlには同じスタイル定義があり、App.xamlで定義されたスタイルをオーバーライドする必要があります。また、ウィンドウには3つのボタンがあります。最初のボタンで、ボタンのコンテンツ内に明示的に定義されたTextBlockコントロール。2番目のボタンでは、コードビハインドのコンテンツとして文字列を設定しました。3番目のボタンでは、コードビハインドのコンテンツとして整数値を設定しました。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;
}

そして今、私たちは何を見ていますか?予想どおり、1番目と3番目のボタンのテキストの余白は0pxですが、2番目のボタンのテキストの余白は10pxです。問題は、2番目のボタンに10pxの余白がある理由と、2番目のボタンにゼロの余白を設定する方法です(App.xamlからスタイルを削除することはできません)。

ありがとうございました!

4

2 に答える 2

2

着替えたら

Button2.Content = "Button with string"; 

Button2.Content = "Button with _string"; 

ボタンのマージンが10から0に変わります。

これはWPFのバグです。すでにMicrosoftConnectで報告されています。

100%確信はありませんが、あなたが見た動作は同じ根本原因が原因だと思います。

ちなみに、正しい動作は、ボタン2と3のMargin=10です。これは、リソースルックアップがビジュアルツリーではなく論理ツリーに沿って実行されるためです。ボタン2と3のTextBlockは、StackPanelの論理ツリー内にありません。

于 2012-06-10T06:39:41.937 に答える
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になりました。何が起こっているのかを正確に理解することに興味があります。

于 2012-06-09T23:06:42.790 に答える