using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes; namespace WpfApp1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent(); imgSlider = new Image() { Stretch = Stretch.UniformToFill };
rootGrid.Children.Add(imgSlider);
LoadMedias(); sb = new Storyboard()
{
Duration = TimeSpan.FromSeconds(3)
}; DoubleAnimation t = new DoubleAnimation()
{
From = 0,
To = 1,
Duration = TimeSpan.FromSeconds(1)
}; Storyboard.SetTarget(t,imgSlider);
Storyboard.SetTargetProperty(t, new PropertyPath("Opacity"));
sb.Children.Add(t);
sb.Completed += Sb_Completed;
Loaded += MainWindow_Loaded;
}
int mediaIndex = 0;
List<string> mediaList = new List<string>();
Storyboard sb;
Image imgSlider;
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Play();
} private void Sb_Completed(object sender, EventArgs e)
{
Debug.Print("Sb_Completed");
Play();
}
private void Play()
{ if (mediaIndex >= mediaList.Count)
{
mediaIndex = 0;
}
sb.Stop();
var url = mediaList[mediaIndex];
BitmapImage bmp = new BitmapImage(new Uri(url, UriKind.RelativeOrAbsolute));
imgSlider.Source = bmp;
sb.Begin();
mediaIndex++; } private void LoadMedias()
{
var files = Directory.GetFiles(@"d:\Pictures\CryptoArt\Collection", "*.jpg").Take(5);
mediaList.AddRange(files); } }
}

  

视频和图片混播:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes; namespace WpfApp1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
player.MediaEnded += Player_MediaEnded;
imgSlider = new Image() { Stretch = Stretch.UniformToFill };
rootGrid.Children.Add(imgSlider);
LoadMedias(); sb = new Storyboard()
{
Duration = TimeSpan.FromSeconds(3)
}; DoubleAnimation t = new DoubleAnimation()
{
From = 0,
To = 1,
Duration = TimeSpan.FromSeconds(1)
}; Storyboard.SetTarget(t,imgSlider);
Storyboard.SetTargetProperty(t, new PropertyPath("Opacity"));
sb.Children.Add(t);
sb.Completed += Sb_Completed;
Loaded += MainWindow_Loaded;
} private void Player_MediaEnded(object sender, RoutedEventArgs e)
{
Play();
} int mediaIndex = 0;
List<string> mediaList = new List<string>();
Storyboard sb;
Image imgSlider;
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Play();
} private void Sb_Completed(object sender, EventArgs e)
{
Debug.Print("Sb_Completed");
Play();
}
private void Play()
{ if (mediaIndex >= mediaList.Count)
{
mediaIndex = 0;
}
sb.Stop();
var url = mediaList[mediaIndex];
if (url.EndsWith(".jpg"))
{
PlayImage(url);
}
else {
sb.Stop();
imgSlider.Visibility = Visibility.Collapsed; player.Visibility = Visibility.Visible;
player.Source = new Uri(url,UriKind.RelativeOrAbsolute);
player.Play(); }
mediaIndex++; } private void PlayImage(string url)
{
player.Stop();
player.Visibility = Visibility.Collapsed; sb.Stop();
BitmapImage bmp = new BitmapImage(new Uri(url, UriKind.RelativeOrAbsolute));
imgSlider.Source = bmp;
imgSlider.Visibility = Visibility.Visible;
sb.Begin(); } private void LoadMedias()
{
var files = Directory.GetFiles(@"d:\Pictures\TestMedia");
mediaList.AddRange(files); } }
}

  

UI:

<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="1920" Width="1080">
<Grid Name="rootGrid" Background="BlueViolet">
<MediaElement Name="player" LoadedBehavior="Manual" />
</Grid>
</Window>

  

有的电脑会出现诡异现象:Sb_Completed 不触发!。。。。。。。。。不是不得骑姐。

WPF Play Image slider animation using Storyboard的更多相关文章

  1. 示例:WPF中自定义StoryBoarService在代码中封装StoryBoard、Animation用于简化动画编写

    原文:示例:WPF中自定义StoryBoarService在代码中封装StoryBoard.Animation用于简化动画编写 一.目的:通过对StoryBoard和Animation的封装来简化动画 ...

  2. WPF 和 UWP 中,不用设置 From 或 To,Storyboard 即拥有更灵活的动画控制

    无论是 WPF 还是 UWP 开发,如果用 Storyboard 和 Animation 做动画,我们多数时候都会设置 From 和 To 属性,用于从起始值动画到目标值.然而动画并不总是可以静态地指 ...

  3. WPF.UIShell UIFramework之自定义窗口的深度技术 - 模态闪动(Blink)、窗口四边拖拽支持(WmNCHitTest)、自定义最大化位置和大小(WmGetMinMaxInfo)

    无论是在工作和学习中使用WPF时,我们通常都会接触到CustomControl,今天我们就CustomWindow之后的一些边角技术进行探讨和剖析. 窗口(对话框)模态闪动(Blink) 自定义窗口的 ...

  4. WPF之小动画一

    定义动画: 直接使用Element进行BeginAnimation DoubleAnimation animation = new DoubleAnimation(); animation.By = ...

  5. WPF中反转3D列表项

    原文:WPF中反转3D列表项 WPF中反转3D列表项                                                         周银辉记得在苹果电脑中有一个很酷的 ...

  6. [No000012F]WPF(7/7) - 样式,触发器和动画

    WPF Tutorial : Beginning [^] WPF Tutorial : Layout-Panels-Containers & Layout Transformation [^] ...

  7. 实现一个 WPF 版本的 ConnectedAnimation

    Windows 10 的创造者更新为开发者们带来了 Connected Animation 连接动画,这也是 Fluent Design System 的一部分.它的视觉引导性很强,用户能够在它的帮助 ...

  8. WPF/WP/Silverlight/Metro App代码创建动画的思路

    在2010年之前,我都是用Blend创建动画,添加触发器实现自动动画,后来写成代码创建的方式.如今Blend已经集成到Visual Studio安装镜像中了,最新的VS2015安装,Blend的操作界 ...

  9. WPF动画的几种模式

    最近在用WPF做简单动画,以下是几点经验总结: 1. 使用DispatcherTimer做动画 VB6的年代大家就用Timer做动画了,不用多解释,这个DispatcherTimer和本身的Timer ...

  10. [WPF自定义控件库]了解WPF的布局过程,并利用Measure为Expander添加动画

    1. 前言 这篇文章介绍WPF UI元素的两步布局过程,并且通过Resizer控件介绍只使用Measure可以实现些什么内容. 我不建议初学者做太多动画的工作,但合适的动画可以引导用户视线,提升用户体 ...

随机推荐

  1. 温习 SPI 机制 (Java SPI 、Spring SPI、Dubbo SPI)

    SPI 全称为 Service Provider Interface,是一种服务发现机制. SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类.这样可以在运行时 ...

  2. Trie树练习题

    Trie树练习题 T1 「一本通 2.3 例 2」The XOR Largest Pair 在给定的 \(N\) 个整数\(A_1,A_2,...A_N\)中选出两个进行异或运算,得到的结果最大是多少 ...

  3. SQL Server 数据太多如何优化

    大家好,我是 V 哥.讲了很多数据库,有小伙伴说,SQL Server 也讲一讲啊,好吧,V 哥做个听话的门童,今天要聊一聊 SQL Server. 在 SQL Server 中,当数据量增大时,数据 ...

  4. 13-1 c++拷贝控制:拷贝赋值与销毁

    定义一个类时,我们必须对它进行拷贝控制,即控制该类在进行拷贝.赋值.移动和销毁时要进行哪些操作 一个类通过五个特殊的成员函数进行拷贝控制 拷贝构造函数 拷贝赋值函数 移动构造函数 移动赋值函数 析构函 ...

  5. Docker 自定义镜像Dockerfile使用详细教程

    认识 Dockerfile 文件 Dockerfile 用于构建 Docker 镜像,Dockerfile 文件是由一行行命令语句 组成,基于这些命令即可以构建一个镜像 比如下面就是一个Dockefi ...

  6. Ansible自动化管理集群,Playbook语法

    Ansible配置文件存在优先级的问题 ANSIBLE_CONFIG ansible.cfg 项目目录 .ansible.cfg 当前用户的家目录 /etc/ansible/ansible.cfg A ...

  7. CAD Plus 移动端使用帮助

    Mac端使用帮助 English help 如果您有疑问或需要帮助请发送邮件至 3167292926@qq.com 1. 权限要求 1.1 获取位置信息 使用文件管理功能时显示网络信息需要获取位置信息 ...

  8. Air780E软件指南:zlib解压示例

    一.ZLIB解压工具简介 Zlib解压工具是一个广泛使用的压缩和解压缩库,主要用于处理数据的压缩和解压缩任务.Zlib使用的是DEFLATE算法,这是一种通用的压缩算法.它被应用在很多场景中,比如压缩 ...

  9. docker番外篇-最详细的安装及部署项目教程(net framework,netcore,java,nodejs,静态html,mysql,redis,私有仓库,https免费证书等)

    目录 本地widows(win11)docker环境安装 安装Docker Desktop 服务器liunx(ubuntu)docker环境安装 安装nginx 安装docker环境 安装docker ...

  10. 鸿蒙NEXT开发案例:二维码的生成与识别

    [引言] 在本篇文章中,我们将探讨如何在鸿蒙NEXT平台上实现二维码的生成与识别功能.通过使用ArkUI组件库和相关的媒体库,我们将创建一个简单的应用程序,用户可以生成二维码并扫描识别. [环境准备] ...