2

我有一个用户控件,它为可见性隐藏和显示定义情节提要(根是用户控件中的顶级网格控件):

<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;
    }
}

可见的故事板工作正常。但是,折叠的故事板不起作用,因为用户控件的可见性立即设置为折叠,使其在故事板运行之前消失。

在情节提要生效之前,如何延迟或覆盖用户控件可见性的实际设置?

4

0 回答 0