3

欲しいもの

複数のUserControlタイプでいくつかのスタイルを再利用したいと思います。

一部のコントロールの背景Borderを点滅させたいのですが、すべてが同期して点滅するように、すべてのコントロールで同じスタイル、静的リソース、およびアニメーションを使用するようにします。


私がそれをやろうとしている方法

そのために、次のように、リソースディクショナリでいくつかの一般的な色を定義しました。

<SolidColorBrush x:Key="StatusErrorBackground" Color="#440000" />

...そして私はこの辞書でStoryBoardも次のように定義しました:

<Storyboard x:Key="BackgroundAnimation">
    <ColorAnimation
        Storyboard.Target="{StaticResource StatusErrorBackground}"
        Storyboard.TargetProperty="Color"
        From="#440000"
        To="#ff0000"
        Duration="0:0:1"
        RepeatBehavior="Forever"
        AutoReverse="True"/>
</Storyboard>

次に、トップレベルに以下を追加しましたUserControl

<FrameworkElement.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="CommonResources.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</FrameworkElement.Resources>

<FrameworkElement.Triggers>
    <EventTrigger RoutedEvent="FrameworkElement.Loaded">
        <BeginStoryboard Storyboard="{StaticResource BackgroundAnimation}"/>
    </EventTrigger>
</FrameworkElement.Triggers>

...そして、UserControlその子である他のさまざまなで、上記のように再インポートし、ResourceDictionaryをに使用し{StaticResource StatusErrorBackground}ますBackground

SolidColorBrush問題の要素は(宣言のように)赤で表示されますが、点滅していません


これまでのあいまいな理解

たぶん、これを行っても、問題の要素に対して適切なPropertyChanged通知が発生しないため、再描画されませんか?またはそのようなもの。のColorプロパティSolidColorBrushは依存関係プロパティではありませんが、をSolidColorBrush実装IAnimatableしているため、ここでは明らかに魔法が起こっています。私にはわかりません。

それとも、同じリソースディクショナリを2つの異なる場所(トップレベルUserControlに1回、子に1回)にインポートしているため、2つの独立したStaticResource参照になってしまうのでしょうか。ResourceDictionary同じファイルを2つの異なるコントロールにインポートすると、それぞれに独立したリソースが作成されますか?その場合、アプリレベルでプルすることでこれを修正できるかもしれません...

誰かが私が間違っていることとそれを修正する方法を教えてもらえますか?

4

3 に答える 3

7

ここで遅れていることはわかっていますが、ソリッド ブラシに保持されている色との間でアニメーション化しようとしたときに、この質問を見つけました。ブラシは、他の人が使用しているリソース ディクショナリの一部であり、変更したくありません。私はこれを作ったばかりで、すぐに試してみましたが、うまくいくように見えました.

public class SolidColorAnimation : ColorAnimation
{
    public SolidColorBrush ToBrush
    {
        get { return To == null ? null : new SolidColorBrush(To.Value); }
        set { To = value?.Color; }
    }
}

次のように xaml で使用します。

        <Trigger Property="IsMouseOver" Value="True">
            <Trigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard >
                        <ui:SolidColorAnimation Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)" ToBrush="{StaticResource NavButtonRolloverBrush}" Duration="0:0:0.75"/>
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.EnterActions>
            <Trigger.ExitActions>
                <BeginStoryboard>
                    <Storyboard >
                        <ui:SolidColorAnimation Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)" ToBrush="{StaticResource NavButtonBrush}" Duration="0:0:0.25"/>
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.ExitActions>
        </Trigger>
于 2015-10-05T12:38:28.433 に答える
1

理由はわかりませんが、Fillプロパティに SolidColorBrush を使用する Rectangle などのダミー オブジェクトを追加し、それをアニメーション化すると機能しFillます。SolidColorBrush の Color がアニメーション化されます。

<SolidColorBrush x:Key="StatusErrorBackground" Color="#440000" />
<Rectangle x:Key="StatusErrorBackgroundRectangle" Fill="{StaticResource StatusErrorBackground}"/>

<Storyboard x:Key="BackgroundAnimation">
    <ColorAnimation 
        Storyboard.Target="{DynamicResource StatusErrorBackgroundRectangle}" 
        Storyboard.TargetProperty="Fill.(SolidColorBrush.Color)" 
        ... />
</Storyboard>
于 2012-08-10T18:06:06.060 に答える