WPF:在情节提要开始时使 UIElement 可见的正确方法是什么



我正在尝试一个简单的图片叠放的动画,问题是,我不知道何时设置新图片的可见性。在动画开始之前,我不想在顶部显示图片。顺序是这样的,一张拉伸的图片在屏幕上,然后另一张相同尺寸的图片在前一张图片的顶部滑入。与旧图片相比,新图片将具有更高的Z索引。我已经建立了一个故事板,并隐藏了新图片的可见性。那么,我什么时候可以看到新图片呢?在呼叫StoryBoard.Begin(MyNewPicture)之前是否正确?所以它变成了

    //create picture object 
    //...
    MyNewPicture.Visibility = Visiblity.Hidden;
    //do some intialisation, and create StoryBoard
    //...
    MyNewPicture.Visibility = Visibility.Visible;
    MyStoryBoard.Begin(MyNewPicture);`

这在我的快速计算机上有效,但我想知道,如果我在慢速计算机上运行它,如果出现某种性能减慢/屏幕滞后等情况,它会不会在动画开始前,当新图片变得可见时,它会覆盖下面的图片?这将在屏幕上产生不希望的闪烁。

还是应该将可见性作为动画的一部分?请看一下其他人之前提出的一个稍微相似的问题的答案。我应该在Xaml中使用ObjectAnimationUsingKeyFrames吗?请注意,一旦动画开始,新图片应该是可见的(永远),在我的情况下没有必要切换可见性。我只希望新图片在动画开始时可见,而不是在动画之前(否则它会阻塞前一张图片)。

如果要通过动画更改Visibility,则必须使用ObjectAnimationUsingKeyFrames:

    <Storyboard x:Key="StartPicture">
        <ObjectAnimationUsingKeyFrames Duration="0:0:0.1" Storyboard.TargetProperty="Visibility">
            <ObjectKeyFrameCollection>
                <DiscreteObjectKeyFrame Value="{x:Static Visibility.Visible}" KeyTime="0:0:0"></DiscreteObjectKeyFrame>
            </ObjectKeyFrameCollection>
        </ObjectAnimationUsingKeyFrames>
        <DoubleAnimation BeginTime="00:00:00.1" Storyboard.TargetProperty="Property" To="Value" />
    </Storyboard>

你也可以设置不透明度从0到100的动画,使图片可见:

    <Storyboard 
        <DoubleAnimation Storyboard.TargetProperty="Opacity" To="100" Duration="0:0:0.1"  />
        <DoubleAnimation BeginTime="0:0:0.1" Storyboard.TargetProperty="PropertyToAnimate" To="Value"  />
    </Storyboard>

通过这种方式,您首先将"不透明度"属性设置为100(以100ms为单位),然后(使用BeginTime="0:0:0.1")设置其余属性。

最新更新