3

次のコードがあります。

<Color x:Key="SelectedColor">Gold</Color> 

そして、色を含む TabItem スタイル

<VisualState x:Name="Selected">
    <Storyboard>
        <ColorAnimationUsingKeyFrames 
            Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Color)"
            Storyboard.TargetName="InnerRectangle2">
            <EasingColorKeyFrame KeyTime="0" Value="{DynamicResource SelectedColor}"/>
        </ColorAnimationUsingKeyFrames>

DynamicResourcea on an を使用できないことがわかりましたEasingColorKeyFrame
効果を得るにはどうすればよいですか?

色を動的に設定する必要があるため、交換"{DynamicResource SelectedColor}"するだけでは問題ありません"{StaticResource SelectedColor}"

問題を示す小さな解決策を作成しました。選択したタブは金色にする必要がありますが、実際には透明です。VSM は「SelectedColor」という名前の色を解決できないと思われるためです。

http://dl.dropbox.com/u/10557283/DynamicBug.zip

4

3 に答える 3

6

アニメーション(VSM)はfreezable objects. Freezable の依存関係プロパティにバインディングを設定するとすぐに、Freezable がフリーズするのを防ぎます。したがって、あなたの Value プロパティのバインディングEasingColorKeyFrame objects are preventing the storyboards from being frozen.

解決策として、これらの 3 つのアプローチのうち、自分に最も適したものを試すことができます。

  • リソースを として宣言しStaticResource、VSM で使用してみてください。VSM の StaticResource の説明

  • あなたのコードから私が理解しているのは、選択した tabItem を黄金色にしたいということです。したがって、回避策として、two bordersパネルに含まれるグリッドを重ねて配置し、デフォルトで金色の境界線visibilityを折りたたんで通常の境界線を表示することができます。これで、selected event(IsSelected のプロパティ変更または任意のアプローチで) tabItem でswap the visibility、同じ効果を与える 2 つの境界線を作成できます。もちろん、この回避策はこのケースに固有のものです。たとえば、EasingColorKeyFrame キー時間が 0 の場合にのみ意味があり、それ以外の場合は同じ視覚効果が得られません。

  • 最後に、アニメーションでやりたい場合は、 でこれを実現できますcode behind。これらの投稿が役に立つかもしれません -アニメーションの dynamicResource の回避策、コード ビハインドのアニメーション、およびVSM を使用したフォアグラウンドの設定

于 2012-07-23T17:09:36.843 に答える
3

これは、VSM タイプが論理ツリーの一部ではないため、動的リソース ルックアップを解決できないためです。

于 2012-04-17T17:09:52.223 に答える
2

レイヤーでそれを行う方法を考え出しました。オブジェクトの複数のコピーを作成し、透明度を次のように変更します。

<VisualState x:Name="Selected">
    <Storyboard>
        <DoubleAnimation Storyboard.TargetName="InnerRectangleBorder"
                         Storyboard.TargetProperty="Opacity"
                         To="0"
                         Duration="0:0:0" />

        <DoubleAnimation Storyboard.TargetName="InnerRectangleBorderMouseOver"
                         Storyboard.TargetProperty="Opacity"
                         To="0"
                         Duration="0:0:0.5" />

        <DoubleAnimation Storyboard.TargetName="InnerRectangleBorderSelected"
                         Storyboard.TargetProperty="Opacity"
                         To="1"
                         Duration="0:0:1" />
    </Storyboard>
</VisualState>
于 2012-07-24T21:13:07.867 に答える