【问题标题】:uwp Image Dimension can't be reset after Storyboard Animation故事板动画后无法重置 uwp 图像尺寸
【发布时间】:2023-03-29 07:03:01
【问题描述】:

我正在使用这个 XAML 故事板来实现两个名为 ctlIMage 和 altImage 的图像之间的转换,定义如下:

    <Image x:Name = "ctlImage" Grid.Column ="0" Grid.Row="0" Grid.ColumnSpan="3" Grid.RowSpan="4" VerticalAlignment= "Stretch"  HorizontalAlignment = "Stretch"  Stretch = "Uniform"  Opacity="0">
        <Image.RenderTransform>
            <CompositeTransform x:Name="image_Transform" ></CompositeTransform >
        </Image.RenderTransform >
    </Image>

        <Image x:Name = "altImage" Grid.Column ="0" Grid.Row="0" Grid.ColumnSpan="3" Grid.RowSpan="4" VerticalAlignment= "Stretch"  HorizontalAlignment = "Stretch"  Stretch = "Uniform"  Opacity="0">
           <Image.RenderTransform>
            <CompositeTransform x:Name="altImage_Transform" ></CompositeTransform >
           </Image.RenderTransform >
        </Image>

        <Storyboard x:Name="ctlImageFadeOut" Completed="SwapAltCtl">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Storyboard.TargetName="ctlImage">
                <EasingDoubleKeyFrame KeyTime="0" Value="1.0" />
                <EasingDoubleKeyFrame KeyTime="0:0:1" Value="0"  />
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="ScaleX" Storyboard.TargetName="image_Transform">
                <EasingDoubleKeyFrame KeyTime="0" Value="1.0" />
                <EasingDoubleKeyFrame KeyTime="0:0:1" Value="0.5"  />
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="ScaleY" Storyboard.TargetName="image_Transform">
                <EasingDoubleKeyFrame KeyTime="0" Value="1.0" />
                <EasingDoubleKeyFrame KeyTime="0:0:1" Value="0.5"  />
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Storyboard.TargetName="altImage">
                <EasingDoubleKeyFrame KeyTime="0" Value="0" />
                <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1.0" />
            </DoubleAnimationUsingKeyFrames>

        </Storyboard>

当我使用此代码播放动画时:

            altImage.Opacity = 0;
            altImage.Visibility = Visibility.Visible;
            altImage.Source = await MainPlayList.GetCurrentImage((int)altImage.Height, (int)altImage.Width);
            ctlImageFadeOut.Begin();

并使用此方法在动画结束时交换两个图像:

    private async void SwapAltCtl(object sender, object e)
    {
        ctlImage.Opacity = 0;
        image_Transform.ScaleX = 1;
        image_Transform.ScaleY = 1;
        ctlImage.Height = altImage.ActualHeight;
        ctlImage.Width = altImage.ActualWidth;
        ctlImage.Source = await MainPlayList.GetCurrentImage((int)ctlImage.Height, (int)ctlImage.Width);
        ctlImage.Opacity = 1;
        altImage.Opacity = 0;
        altImage.Visibility = Visibility.Collapsed;
    }

我最终得到了一个一半大小的 ctlImage,就像 ScaleX 和 ScaleY 在 XAML 情节提要之后不会重置。如您所见,我什至尝试将高度和宽度重置为已知值(已显示的备用图像)。

动画结束后如何重置图片?

谢谢!

【问题讨论】:

    标签: c# image xaml uwp storyboard


    【解决方案1】:

    删除SwapAltCtl 方法,实际上你不需要它。您只需将StoryboardFillBehavior 属性设置为Stop,该属性的默认值为HoldEnd

    来自文档,

    FillBehavior="Stop"

    默认情况下,当动画结束时,即使超过其持续时间,动画也会将属性值保留为最终的 To 或 By-modified 值。但是,如果将 FillBehavior 属性的值设置为 FillBehavior.Stop,则动画值的值将恢复为应用动画之前的值,或者更准确地说,恢复为由依赖属性系统确定的当前有效值 (有关此区别的详细信息,请参阅依赖属性概述)。

    还有一行要修改。当动画结束时,您希望ctlImage 重置为初始状态并再次可见,因此您应该将ctlImageOpacity 的初始值设置为1.0。

    【讨论】:

    • 谢谢,这很有用。但是为什么我不能在动画结束后修改 ScaleX 和 ScaleY 属性呢?
    • 你的意思是,在你设置 FillBehavior="Stop" 之后?
    • 我的意思是:我确实需要 SwatAltCtl: 在我的其余代码中,ctlImage 是用于其他修改的主图像。所以我的想法是:始终显示 ctlImage 并用于操作。当用户选择另一个图像时,它会加载到 atlImage 中,用于动画的持续时间,然后该新图像然后交换回 ctlImage。因此,我不想将 ctlImage 重置为再次可见,直到它保存新图像,否则显示会闪烁。这仅适用于交叉淡入淡出,但我似乎无法重置 ScaleX/ScaleY
    • 在我的测试中,如果 FillBehavior="Stop",ScaleX/ScaleY 重置为 1,如果 FillBehavior="HoldEnd",则保持 0.5。这与文档一致。
    • 同意。我也一样。但是设置 image_Transform.ScaleX=1 应该把它们放回 1,不是吗?在我的测试中,它确实将它们重置为 1,但图像保持一半大小......??
    猜你喜欢
    • 2015-02-10
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 2013-02-05
    相关资源
    最近更新 更多