0

アプリケーション レベルで TextBlock のスタイルを定義し、いくつかの TextBlock を使用するアプリケーション レベルで「DataClass」の DataTemplate も定義するとします。ここで、アプリケーションの一部で、TextBlock の外観を再定義したいので、TextBlock のスタイルを再定義するだけで済みます。

ここでの問題は、アプリケーションのこのサブパートに DataTemplate が適用されている場合、内部のすべての TextBlocks が (再定義されたバージョンではなく) アプリケーション レベルの TextBlock スタイルを引き続き使用することです。DataTemplate のスタイルを再定義する方法を知っている人はいますか?

4

1 に答える 1

0

スタイルは<Application.Resources>アプリケーション全体に適用され、既定のスタイル ルックアップ ルールに常に従うわけではありません。

通常、その動作が望ましくない場合は、<Window.Resources>代わりにスタイルを配置して、ウィンドウ内のオブジェクトにのみ適用され、通常のスタイル ルックアップ ルールが使用されるようにします。

デフォルトでは、やなどのほとんどのデフォルトの WPF コントロールであるから継承するオブジェクトのスタイルを除き、スタイルはコントロール/テンプレートの境界を越えて適用されません。ControlLabelTextBox

したがって、オブジェクト内の任意のControlオブジェクトのスタイルを設定し.Resourcesて、すべての子オブジェクトに適用できます。

<UserControl.Resources>
    <Style TargetType="{x:Type Label}">
        <Setter Property="Foreground" Value="Red" />
    </Style>
</UserControl.Resources>

ただし、 はand ではなくTextBlockから継承するため、 a のスタイルはテンプレートの境界を越えて適用されません。FrameworkElementControlTextBlock

スタイルを に保持したい場合は、Application.Resourcesを作成する直前に、そのスタイルのプロパティをビジュアル ツリーのさらに下に上書きする必要があります。TextBlock

<UserControl x:Class="MyNamespace.MyDataTypeView"... >
    <UserControl.Resources>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Foreground" Value="Black" />
        </Style>
    </UserControl.Resources>

    <TextBlock Text="Test" />
</UserControl>

ただし、このスタイルは、内UserControlのテキストなど、内の別のコントロール内のオブジェクトには適用されません。ComboBoxItemsComboBox

TextBlock子コントロール内で使用される は からスタイルを適用しますが、でTextBlock定義された TextBlock スタイルはコントロール/テンプレートの境界を越えますが、他ので定義された TextBlock スタイルは適用されApplication.Resourcesないため、 からではありません。 <UserControl.Resources>Application.ResourcesX.Resources

x:Staticこれらの特定の状況では、色の設定に使用されるブラシ キーを追跡し、次のようTextBlock.Textに に上書きする必要がある場合があります。ComboBox.Resources

( SystemColorsキーが間違っている可能性があります)

<ComboBox.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" />
</ComboBox.Resources>
于 2013-01-07T16:07:36.660 に答える