0

ExpressionBlendを使用してオブジェクトの境界線の色をアニメーション化しようとしています。

ストーリーボード内の境界線の値を以前に作成したブラシリソースの値に変更すると、オブジェクトのベース境界線がアニメーション化されるのではなく変更されます。プロパティの値を基本値の値に変更すると(つまり、ブラシリソースを使用しない場合)、アニメーションは意図したとおりに機能します。

ブラシリソースを使用してカラープロパティをアニメーション化することはできませんか?

境界線にハードコードされたカラー値を使用するときにExpressionBlendによって生成されるコードは次のとおりです(このコードは機能し、アニメーションは正しく再生されますが、境界線の値はハードコードされています)。

<Style x:Key="StandardTextBoxStyle" BasedOn="{x:Null}" TargetType="{x:Type TextBox}">
    (...)
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBox}">
                <Grid x:Name="grid">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                        (...)
                        </VisualStateGroup>
                        <VisualStateGroup x:Name="FocusStates">
                            <VisualStateGroup.Transitions>
                                <VisualTransition GeneratedDuration="0" To="Focused">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="rectangle">
                                            <EasingColorKeyFrame KeyTime="0" Value="#FFC2C2C2"/>
                                            <EasingColorKeyFrame KeyTime="0:0:0.2" Value="#FF5FA5C9"/>
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualTransition>
                            </VisualStateGroup.Transitions>
                            <VisualState x:Name="Unfocused"/>
                            <VisualState x:Name="Focused"/>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    (...)
</Style>

ハードコードされた値#FF5FA5C9をローカルブラシリソースの値に置き換えるにはどうすればよいですか?Value = "#FF5FA5C9"ステートメントをDynamicResource / StaticResourceステートメントに置き換える必要がありますか?

4

2 に答える 2

2

ブラシリソースにアニメーション化する代わりに、長方形の形状を別のコピーにしてRectangle_Focusedのような名前を付け、既存の長方形の上に順番に配置して、元の長方形の上に表示することをお勧めします。

この図形に境界線ブラシリソースを追加してから、図形の可視性を折りたたみに設定します。次に、フォーカス状態、マウスオーバー状態、または任意の状態で、表示を表示に戻します。一種のような;

<VisualState x:Name="Focused">
                                    <Storyboard>
                                        <DoubleAnimation Duration="0:0:0.1" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="FocusVisualElement" d:IsOptimized="True"/>
                                        <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="MouseOverBorder" d:IsOptimized="True"/>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="Background_Copy">
                                            <DiscreteObjectKeyFrame KeyTime="0">
                                                <DiscreteObjectKeyFrame.Value>
                                                    <Visibility>Visible</Visibility>
                                                </DiscreteObjectKeyFrame.Value>
                                            </DiscreteObjectKeyFrame>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>

理由は聞かないでください。同じオブジェクト内のブラシリソースをアニメートしてもカットされませんが、このように、探しているのと同じ効果を得ることができます。

于 2012-01-06T14:58:32.163 に答える
1

私は問題を見つけたと思います。

いくつかの理由で、ストロークの値をローカルのブラシリソースの値として割り当てても、アニメーションのストーリーボードにキーフレームは作成されません。

してはいけないことは次のとおりです。

http://i.imgur.com/5X7Xm.jpg

代わりに、Colorローカルリソースを作成し、次のように割り当てる必要があります。

http://i.imgur.com/UGIOl.jpg

ストーリーボードのキーフレームが適切に作成され、アニメーションが機能します。

Expression Blendのバグかもしれませんか?これは正常に機能していますか?わからない:)

于 2012-01-06T14:55:07.120 に答える