定義アニメーションやトリガーとして再利用可能な資源か?
-
11-09-2019 - |
質問
はしてもらえると助かりますを定義するアニメーションのどこかでーす(例.資源として)、そして再利用する複数の時間は何時ですか?たくさん持っているんですが独立したブラシを広範datatemplates独立に必要があるのと同じようなアニメーションに基づくdatatrigger.現在あると思われるからでアニメーションを定義する絵コンテ.TargetNameや絵コンテ.TargetProperty.こんに反の目的で再利用性.いかなどを宣言するのに使"このアニメーションの資源が適用され他の要素です。
っといっていいのかもしれないな、かつ不可欠な要求さん理由がないことを前述のacomplish.私何かが足りない。
同じめをトリガーとする。仮にはたくさん持っているんですが、範視覚的要素をすべて表示されるものと同じタイプの状態を色像。E.g.フェードに時間が経過した場合は、自動的に"アクティブフェードを"赤"と"エラー"など。という違いがあるだけではビジュアルがその形状/visual木希望のアニメーション動作は同じすべての要素のどこかにアクセシブルデザインツリーのプロパティを持ってのタイプカラーです。せざるをえないと思う考えにくいう面倒なので新たに定義と同じアニメーション、datatriggerを設定します。各開発者が嫌いです。僕は必死に探すの溶液を必要としない(少なくとも非常に少ない)のc#コードを作ります。
私たちはこの:
を定義するアニメの資源likこと(これを繰り返しすべての基本的なありように活かす活動休止、エラー):
<ColorAnimationUsingKeyFrames x:Key="deactivatingColorAnimation"
Storyboard.TargetProperty="Material.(MaterialGroup.Children)[0].Brush.(SolidColorBrush.Color)"
FillBehavior="HoldEnd" RepeatBehavior="Forever" AutoReverse="True">
<ColorAnimationUsingKeyFrames.KeyFrames>
<LinearColorKeyFrame KeyTime="00:00:00" Value="Gray"/>
<LinearColorKeyFrame KeyTime="00:00:0.25" Value="Gray"/>
<LinearColorKeyFrame KeyTime="00:00:0.5" Value="Gray" />
<LinearColorKeyFrame KeyTime="00:00:0.75" Value="Gray" />
</ColorAnimationUsingKeyFrames.KeyFrames>
</ColorAnimationUsingKeyFrames>
利用で絵コンテ、トリガー(繰り返しこのzillionsの各国におけるX毎に異なstateviusal、常に新しい名前に絵コンテ):
<DataTrigger Binding="{Binding SubstrateHolder.State}" Value="Deactivating">
<DataTrigger.EnterActions>
<BeginStoryboard x:Name="someStateVisualDeactivatingStoryboard">
<Storyboard Storyboard.TargetName="someStateVisual">
<StaticResource ResourceKey="deactivatingColorAnimation" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="someStateVisualDeactivatingStoryboard" />
</DataTrigger.ExitActions>
</DataTrigger>
で容易に想像できなど膨張ーしています繰り返しコピー&ペーストされた全てのzillion DataTriggers.
で涼を定義するすべてこのトリガーを一度に適用する異なる状態にします。どのように何かこのように、このコンポーネントのラインナップ?ッ?
解決 2
この一般的な問題への良いXAMLのみのソリューションがあるように思えません。私は、指定された要素のすべてのアニメーション動作を定義自分の添付プロパティを書くことになりました。このような何かます:
<DataTemplate>
<!-- ... -->
<Rectangle Fill="Gray">
<v:AnimationHelper.Animations>
<v:StandardColorStateAnimation TargetColorProperty="(Rectangle.Fill).(SolidColorBrush.Color)" TargetStateProperty={Binding State} />
</v:AnimationHelper.Animations>
</Rectangle>
<DataTemplate>
残りは(アニメーションなどを作成)分離コードで行われます。
他のヒント
きょうはこのような態度を取るのか。
- 包むすべての電流制御テンプレートを目に見えないルート要素,例.国境やStackPanel、バウンディングボックスの全体ます。
- を作成したテンプレート制御のためには目に見えないボックスを含むすべてのトリガやアニメーション
- の動画をアニメーションの任意のColorプロパティには見えない。
- のために木をして、結合する他の物件にしたいアニメーションのColorプロパティのルート要素になります。
私はこの問題は、この投稿の時点で少し死んで実現するが、私は後ろの非常に少ないコードを必要とする解決策を見つけた。
あなたはとユーザーコントロールを作ることができるカスタムプロパティに(下にスクロールしますあなたの長方形だけでなく、アニメーションと状態のトリガーが含まれている。図8)程度です。このユーザーコントロールは、変更されたときに色の変化をトリガする状態としてパブリックプロパティを定義します。
必要なだけのコードビハインドコードであなたの変数を作成することです。
ユーザーコントロールは、それらは、XAMLのストーリーボードやデータトリガーを書き換えることなく、何度も再利用することができます。
最も"ー の道"をこの目標を達成して私が考えられることはいは専用 MarkupExtension
う引きのアニメーションの資源辞書および設定に必要な特性のい方限定のサブセット Storyboard.Target
, Storyboard.TargetName
や Storyboard.TargetProperty
.が必要とされるコードの後ろでは、一時、また、 MarkupExtension
sは使用できるよう設計され ー.こちらは最も単純なバージョン:
[MarkupExtensionReturnType(typeof(Timeline))]
public class AnimationResourceExtension : StaticResourceExtension
{
//This property is for convienience so that we
//don't have to remember to set x:Shared="False"
//on all animation resources, but have an option
//to avoid redundant cloning if it is
public bool IsShared { get; set; } = true;
public DependencyObject Target { get; set; }
public string TargetName { get; set; }
public PropertyPath TargetProperty { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (base.ProvideValue(serviceProvider) is Timeline animation)
{
//If the animation is shared we shall clone it
//Checking if it is frozen is optional and we can
//either clone it or throw an exception
//(or simply proceed knowing one will be thrown anyway)
if (IsShared || animation.IsFrozen)
animation = animation.Clone();
Storyboard.SetTarget(animation, Target);
Storyboard.SetTargetName(animation, TargetName);
Storyboard.SetTargetProperty(animation, TargetProperty);
return animation;
}
else
throw new XamlException("The referenced resource is not an animation");
}
}
使い方は非常に素直なものです:
<FrameworkElement.Resources>
<DoubleAnimation x:Key="MyAnimation" From="0" To="1" Duration="0:0:1" />
</FrameworkElement.Resources>
(...)
<Storyboard>
<utils:AnimationResource ResourceKey="MyAnimation" TargetName="SomeElement" TargetProperty="Opacity" />
</Storyboard>
て簡単にできることをその限界-表示をサポートしていないもの Binding
も DynamicResource
拡張のため前述の物件です。しかしながら、それは達成可能ですが、要するものです。 Binding
支援すべきインターネットはモバイル-の問題の適切な利用 XamlSetMarkupExtensionAttribute
(プラス定型コードとします。 DynamicResource
支援が少しややこしくなり、使用いただくほか、 XamlSetMarkupExtensionAttribute
いラッピング IServiceProvider
戻り適切な IProvideValueTarget
実装が可能です。