非表示と表示のストーリーボードを定義するユーザー コントロールがあります (ルートはユーザー コントロールの最上位のグリッド コントロールです)。
<Storyboard x:Key="VisibleStoryboard">
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Root" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Visible}" KeyTime="0" />
</ObjectAnimationUsingKeyFrames>
<DoubleAnimation Storyboard.TargetName="RootScale" Storyboard.TargetProperty="ScaleY" From="0" To="1" Duration="{StaticResource Duration}" />
<DoubleAnimation Storyboard.TargetName="Root" Storyboard.TargetProperty="Opacity" To="1" Duration="{StaticResource Duration}"/>
</Storyboard>
<Storyboard x:Key="CollapsedStoryboard">
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Root" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Collapsed}" KeyTime="{StaticResource DurationKeyTime}" />
</ObjectAnimationUsingKeyFrames>
<DoubleAnimation Storyboard.TargetName="RootScale" Storyboard.TargetProperty="ScaleY" From="1" To="0" Duration="{StaticResource Duration}" />
<DoubleAnimation Storyboard.TargetName="Root" Storyboard.TargetProperty="Opacity" To="0" Duration="{StaticResource Duration}"/>
</Storyboard>
コントロールの可視性が変化したときに、これらのストーリーボードを適用しています。
static MyControl()
{
VisibilityProperty.OverrideMetadata(typeof(Warning), new PropertyMetadata(VisibilityChanged));
}
private static void VisibilityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var element = (FrameworkElement)d;
switch ((Visibility)e.NewValue)
{
case Visibility.Visible:
((Storyboard)element.FindResource("VisibleStoryboard")).Begin(element);
break;
case Visibility.Collapsed:
((Storyboard)element.FindResource("CollapsedStoryboard")).Begin(element);
break;
}
}
表示されるストーリーボードは正常に機能します。ただし、折りたたまれたストーリーボードは機能しません。ユーザー コントロールの可視性がすぐに折りたたまれた状態に設定され、ストーリーボードが実行される前に消えてしまうためです。
ストーリーボードが有効になるまで、ユーザー コントロールの可視性を実際に設定するのを遅らせたり上書きしたりするにはどうすればよいですか?