1

私は2つのスタイルを設定していますUserControl.Resources

    <Style TargetType="{x:Type TextBlock}">
        <Setter Property="Foreground" Value="white" />
    </Style>
    <Style TargetType="{x:Type Label}">
        <Setter Property="Foreground" Value="white" />
    </Style>

そのため、私のDataTemplate(そして残りを切り取ったことに注意してください)では、すべてLabelTextBlock要素のプロパティを変更することなく、白いテキストを適用します。

<DataTemplate x:Key="FileTransferItemTemplate">
        <StackPanel Orientation="Vertical">
            <StackPanel Orientation="Horizontal">
                <Label Content="Transferring With: " />
                <TextBlock Text="{Binding Path=OtherUserName, Mode=TwoWay}" />
            </StackPanel>
</DataTemplate>

ただし、データがバインドされると、前景色がデフォルトで黒になります(これにより、変更が表示されなかったためにデータバインディングが不適切であると思われるという長い悪夢が発生しました)。私のデータバインドされたテキストは、黒の背景に黒で、長い間気づいていませんでした。

これをオーバーライドできる唯一の方法は、を手動で設定するForeground="White"ことTextBlockです。Labelデータバインドされていないため、色に対しては問題なく機能します。

なぜこれが起こっているのですか、どうすれば修正できますか?

4

1 に答える 1

3

問題はバインディングとは関係ありません。DataTemplateの内部から外部で定義されたデフォルトスタイルのルックアップは、Controlから派生した要素に対してのみ機能するようです。TextBlockはControlから派生していないため、デフォルトのスタイルが見つかりません。

このページでは、Microsoftが提供する次の2つのステートメントを引用しています。

この動作は「設計による」ものであり、これが理由です。テンプレートは、カプセル化の境界と見なされます。これらのテンプレートによって生成された要素は、この境界内にあります。そして、TargetTypeが一致するスタイルの検索は、この境界で停止します。したがって、テンプレートを介して生成された再現のTextBlockは、問題のスタイルを取得しません。一方、テンプレートの外部で定義されたTextBlockはそうします。この問題を回避する1つの方法は、Styleに明示的な名前を付け、テンプレート内のTextBlockでこの名前でスタイルを参照することです。

Controlのサブタイプではない要素の暗黙的なスタイルを検索する場合、テンプレートはカプセル化の境界と見なされます。

于 2013-01-05T22:25:29.560 に答える