UWP - 背景图像上的淡入效果

Posted

技术标签:

【中文标题】UWP - 背景图像上的淡入效果【英文标题】:UWP - FadeIn effect on background image 【发布时间】:2016-06-09 08:17:07 【问题描述】:

我需要对我的背景图像进行淡入淡出。在运行时可以更改图像源,这可以按预期与设置的绑定一起使用。反正对应的动画不带任何视觉效果。目前我的 xaml 如下所示:

xmlns:Interactivity="using:Microsoft.Xaml.Interactivity" 
xmlns:Core="using:Microsoft.Xaml.Interactions.Core"
xmlns:Media="using:Microsoft.Xaml.Interactions.Media"

<Page.Content>
    <Grid>
        <Grid.Background>
            <ImageBrush x:Name="image" ImageSource="Binding Path=ImageSource,UpdateSourceTrigger=PropertyChanged" Stretch="UniformToFill" >
                <Interactivity:Interaction.Behaviors>
                    <Core:EventTriggerBehavior EventName="ImageOpened" >
                        <Media:ControlStoryboardAction ControlStoryboardOption="Play">
                            <Media:ControlStoryboardAction.Storyboard>
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:1" Storyboard.TargetName="image"/>
                                </Storyboard>
                            </Media:ControlStoryboardAction.Storyboard>
                        </Media:ControlStoryboardAction>
                    </Core:EventTriggerBehavior>
                </Interactivity:Interaction.Behaviors>
            </ImageBrush>
        </Grid.Background>

当我改用时:

             [...]
             <Media:ControlStoryboardAction.Storyboard>
                                <Storyboard>
                                    <FadeInThemeAnimation Storyboard.TargetName="Image" />
                                </Storyboard>
                            </Media:ControlStoryboardAction.Storyboard>

我明白了

System.Runtime.InteropServices.COMException:未检测到已安装的组件。

无法解析 TargetName 图像。 在 Windows.UI.Xaml.Media.Animation.Storyboard.Begin() 在 Microsoft.Xaml.Interactions.Media.ControlStoryboardAction.Execute(对象发送者,对象参数) 在 Microsoft.Xaml.Interactivity.Interaction.ExecuteActions(对象发送者,ActionCollection 操作,对象参数) 在 Microsoft.Xaml.Interactions.Core.EventTriggerBehavior.OnEvent(对象发件人,对象 eventArgs)

有什么想法吗?

[编辑] 感谢@SWilko 的回答,我确定动画仅适用于图像。如果我将 ImageBrush 更改为 Image 并将其放入网格(而不是 Grid.Background)中,我上面的代码就可以工作。

【问题讨论】:

【参考方案1】:

使用Image 控件并根据需要在顶部添加更多控件不是更容易吗,例如

 <Grid x:Name="LayoutGrid">
    <Image x:Name="image" Stretch="UniformToFill" 
           Source="Binding Path=ImageSource,UpdateSourceTrigger=PropertyChanged" 
           Opacity="0" Visibility="Collapsed">
        <interactivity:Interaction.Behaviors>
            <core:EventTriggerBehavior EventName="ImageOpened">
                <media:ControlStoryboardAction x:Name="sbAction" ControlStoryboardOption="Play">
                    <media:ControlStoryboardAction.Storyboard>
                        <Storyboard x:Name="sb">
                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)"
                                                           Storyboard.TargetName="image">
                                <DiscreteObjectKeyFrame KeyTime="00:00:00">
                                    <DiscreteObjectKeyFrame.Value>
                                        <Visibility>Visible</Visibility>
                                    </DiscreteObjectKeyFrame.Value>
                                </DiscreteObjectKeyFrame>
                            </ObjectAnimationUsingKeyFrames>
                            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)"
                               Storyboard.TargetName="image">
                                <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                                <EasingDoubleKeyFrame KeyTime="0:0:3" Value="0.5"/>
                                <EasingDoubleKeyFrame KeyTime="0:0:5" Value="1"/>
                            </DoubleAnimationUsingKeyFrames>
                        </Storyboard>
                    </media:ControlStoryboardAction.Storyboard>
                </media:ControlStoryboardAction>
            </core:EventTriggerBehavior>
        </interactivity:Interaction.Behaviors>
    </Image>        
</Grid>

编辑

更新图像并从头开始动画。 我已将 Visibility 切换动画添加到 Storyboard 并命名为 Storyboard sb

现在在后面的代码中,我使用 Storyboard Completed 事件来更改图像并重新启动动画。您可以在适合您的应用程序的地方执行此操作,这只是为了展示一个示例。 例如

sb.Completed += (sender, e) =>

       //this is a local image for me you would probably update your ImageSource property here
       var newimg = new BitmapImage(new Uri("ms-appx:///Assets/rock.jpg"));
       image.Source = newimg;
       image.Opacity = 0;
       image.Visibility = Visibility.Collpased;

       sb.Begin();
;

【讨论】:

感谢@Swilko 的解决方案。我在运行时设置图像不止一次。执行动画后,不透明度为 1。我必须将每个动画的不透明度重置为 0。我怎样才能做到这一点? 成功了跨度>

以上是关于UWP - 背景图像上的淡入效果的主要内容,如果未能解决你的问题,请参考以下文章

在循环中更改 div 元素的背景颜色交叉淡入淡出

uwp 高分辨率缩略图

Android使用淡入/淡出动画更改背景图像

jquery淡入淡出div中的背景图像 - 交叉淡入淡出

淡入淡出轮播图怎么解决闪白的问题

使用另一个图像淡入/淡出背景图像/淡出其他元素