4

WPF で利用できるさまざまなオープン ソース テーマを見て、色がシステム カラーにマッピングされていないことに少し驚いています。したがって、システム全体の構成を変更しても、これらのテーマは変更されません。

システムの色を適切に使用するテーマはありますか? もしそうなら、それらの色を活用するボタン スタイルをどのように記述すればよいですか?

例を挙げると、ボタンのスタイルは次のとおりです。

    <Style x:Key="specialButton" TargetType="Button">
        <Setter Property="SnapsToDevicePixels" Value="True"/>
        <Setter Property="OverridesDefaultStyle" Value="True"/>
        <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
        <Setter Property="Background" Value="{StaticResource NormalBrush}"/>
        <Setter Property="Margin" Value="2"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Border Name="border"
                    BorderThickness="1"
                    Background="{TemplateBinding Background}"
                    BorderBrush="{StaticResource NormalBorderBrush}"
                    Padding="1,1">
                        <ContentPresenter Name="content" HorizontalAlignment="Center" VerticalAlignment="Center" RecognizesAccessKey="True"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="border" Property="BorderBrush" Value="{StaticResource DarkBrush}"/>
                        </Trigger>
                        <Trigger Property="IsPressed" Value="True">
                            <Setter TargetName="border" Property="Background" Value="{StaticResource PressedBrush}"/>
                            <Setter TargetName="border" Property="BorderBrush" Value="{StaticResource PressedBorderBrush}"/>
                        </Trigger>
                        <Trigger Property="IsDefaulted" Value="True">
                            <Setter TargetName="border" Property="BorderBrush" Value="{StaticResource DefaultedBorderBrush}"/>
                        </Trigger>
                        <Trigger Property="IsFocused" Value="True">
                            <Setter TargetName="border" Property="BorderBrush" Value="{StaticResource DefaultedBorderBrush}"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="False">
                            <Setter TargetName="border" Property="Background" Value="{StaticResource DisabledBackgroundBrush}"/>
                            <Setter TargetName="border" Property="BorderBrush" Value="{StaticResource DisabledBorderBrush}"/>
                            <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

問題は、名前付きの静的リソースを指定して、システムの色にフックする方法です。たとえば、背景は次のようになります。

    <LinearGradientBrush x:Key="NormalBrush" StartPoint="0,0" EndPoint="0,1">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="{DynamicResource {x:Static SystemColors.ControlLightLightColorKey}}" Offset="0.0"/>
                <GradientStop Color="{DynamicResource {x:Static SystemColors.ControlLightColorKey}}" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

ただし、これは標準のボタンのようには見えません。XAMLPAD を使用してボタンを調べると、次のように表示されます。

     <LinearGradientBrush x:Key="NormalBrush" StartPoint="0,0" EndPoint="0,1">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#FFF3F3F3" Offset="0.0"/>
                <GradientStop Color="#FFEBEBEB" Offset="0.5"/>
                <GradientStop Color="#FFDDDDDD" Offset="0.5"/>
                <GradientStop Color="#FFCDCDCD" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

使用されている色は定数のように見え、システム カラーに基づいていません。

4

1 に答える 1

2

サードパーティのテーマについてはわかりませんが、システム カラーはSystemColorsクラスを通じて Xaml で利用できます。このクラスは、次の 2 つの方法のいずれかで xaml で使用できるリソースのキーを公開します。

<Border Background="{x:Static SystemColors.ControlDarkBrushKey}" />

また:

<Border Background="{StaticResource {x:Static SystemColors.ControlDarkBrushKey}}" />

ControlDarkBrush上記のいずれかで、システムの色と同じ背景の境界線が表示されます。私が提供したドキュメント リンクは、利用可能なリソースの完全なリストを提供します。

SystemColors利用可能な各色と色自体の両方を提供することは注目に値しBrushます。したがって、あるシステム カラーから別のシステム カラーにフェードする独自のブラシを作成する場合は、これを簡単に作成できます。

于 2012-08-06T12:57:21.990 に答える