ColorAnimationUsingKeyFrames更改画笔

时间:2012-11-08 17:50:04

标签: wpf xaml blend visualstates

嗨嗨,我是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>

这两个画笔在这里:

    <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应该更改BorderColor和TextBox的背景,但它也会更改使用NormalBrush的所有内容的颜色。我希望所有控件都只有很少的画笔,以便轻松修改主题。还有一件事我在其他样式中使用Usualy作为StaticResource。您的建议和帮助将受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

StaticResource定义为STATIC(共享),因此设置STATIC资源属性的动画将影响在其范围内使用StaticResource的所有元素。通过将x:Shared属性标记为FALSE,WPF将为使用它的每个元素与一个静态资源创建一个实例:

<SolidColorBrush x:Key="OniiNormalBrush" x:Shared="False" Color="{StaticResource MainColor}"/>

答案 1 :(得分:0)

嗯,我从来没有发现为什么一种颜色在任何地方都会改变,而第二种颜色则没有。正如评论中所建议的,我将该样式更改为使用触发器而不是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的定义,所有内容都符合{Color {1}}