0

こんにちは、私は WPF の初心者で、WPF コントロールのスタイルを変更しようとしたのはこれが初めてです。Expression Blend のおかげで、このスタイルを作成するまで、すべてが予想以上にうまくいきました。

 <Style TargetType="{x:Type TextBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBox}">
                <Grid>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal"/>
                            <VisualState x:Name="Disabled">
                                <Storyboard>
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="PART_ContentHost">
                                        <EasingDoubleKeyFrame KeyTime="0" Value="0.5"/>
                                    </DoubleAnimationUsingKeyFrames>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="Background">
                                        <EasingColorKeyFrame KeyTime="0" Value="Red"/>
                                    </ColorAnimationUsingKeyFrames>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="Background">
                                        <EasingColorKeyFrame KeyTime="0" Value="Yellow"/>
                                    </ColorAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="ReadOnly"/>
                            <VisualState x:Name="MouseOver"/>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Rectangle x:Name="Background" Fill="{StaticResource ControlBackgroundBrush}" Stroke="{StaticResource NormalBrush}" RadiusX="2" RadiusY="2"/>
                    <ScrollViewer x:Name="PART_ContentHost" Margin="2" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" FontFamily="{TemplateBinding FontFamily}"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Foreground" Value="Black"/>
    <Setter Property="SnapsToDevicePixels" Value="True"/>
</Style>

これらの 2 つのブラシは次のとおりです。

    <Color x:Key="MainColor">#FF595959</Color>
<Color x:Key="ControlBackgroundColor">#FF333333</Color>

<SolidColorBrush x:Key="NormalBrush" Color="{DynamicResource MainColor}"/>
<SolidColorBrush x:Key="ControlBackgroundBrush" Color="{StaticResource ControlBackgroundColor}" />

さて、問題は何ですか。TextBox を無効にすると、TextBox の BorderColor と Background が変更されますが、使用するすべての色も変更されますNormalBrush。テーマを簡単に変更できるように、すべてのコントロールに共通のブラシをいくつか用意したいと考えています。もう1つ、通常は他のスタイルでStaticResourceとして使用します。あなたの提案と助けをいただければ幸いです。

4

2 に答える 2

1

StaticResourceは定義上STATIC(共有)であるため、STATICリソースのプロパティをアニメーション化すると、そのスコープ内でStaticResourceを使用するすべての要素に影響します。x:Shared属性をFALSEにマークすることにより、WPFは、1つの静的リソースに対してそれを使用する各要素のインスタンスを作成します。

<SolidColorBrush x:Key="OniiNormalBrush" x:Shared="False" Color="{StaticResource MainColor}"/>
于 2012-11-08T18:06:17.357 に答える
0

ある色がどこでも変更され、2 番目の色が変更されない理由がわかりませんでした。コメントで示唆されているように、そのスタイルを変更して、visualStates の代わりにトリガーを使用すると、すべて正常に動作します。

<Style TargetType="{x:Type TextBox}">
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type TextBox}">
            <Grid>
                <Rectangle x:Name="Background" Fill="{StaticResource ControlBackgroundBrush}" Stroke="{StaticResource NormalBrush}" RadiusX="2" RadiusY="2"/>
                <ScrollViewer x:Name="PART_ContentHost" Margin="2" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" FontFamily="{TemplateBinding FontFamily}"/>
            </Grid>
            <ControlTemplate.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Fill" TargetName="Background" Value="Red" />
                    <Setter Property="Stroke" TargetName="Background" Value="Green" />
                    <Setter Property="Foreground" Value="Blue" />
                </Trigger>
            </ControlTemplate.Triggers>
         </ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="SnapsToDevicePixels" Value="True"/>

編集

NormalBrushすべては、色がどこにあるかの定義によって引き起こされましたDynamicResource

于 2012-11-14T09:13:53.750 に答える