在WPF里用MediaElement控件,实现一个循环播放单一视频的程序,同时可以控制视频的播放、暂停、停止。

  一种方式,使用MediaElement.MediaEnded事件,在视频播放结束后,自动重新播放;

  另一种方式,使用WPF定时器,在定时器事件里写入视频播放代码。

  后者优点是可以控制循环时长,不必等到视频播放结束就可以开始下一次播放,比如:同时启动多个播放程序,使多个时长不同的视频同时播放,无限循环,如果采用第一种方式,累计多次自动播放后,视频内容就无法同步。

第一种方式:

 XAML:
<MediaElement x:Name="mediaElement" HorizontalAlignment="Left" Height="" VerticalAlignment="Top" Width=""/>
<Button x:Name="btnPlay" Content="Play" HorizontalAlignment="Left" Margin="68,279,0,0" VerticalAlignment="Top" Width="" Click="btnPlay_Click"/>
<Button x:Name="btnPause" Content="Pause" HorizontalAlignment="Left" Margin="170,279,0,0" VerticalAlignment="Top" Width="" Click="btnPause_Click"/>
<Button x:Name="btnStop" Content="Stop" HorizontalAlignment="Left" Margin="295,279,0,0" VerticalAlignment="Top" Width="" Click="btnStop_Click"/>
 C#:
// 窗口加载事件
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// 绑定视频文件
mediaElement.Source = new Uri("D:/bird.mp4"); // 交互式控制
mediaElement.LoadedBehavior = MediaState.Manual; // 添加元素加载完成事件 -- 自动开始播放
mediaElement.Loaded += new RoutedEventHandler(media_Loaded); // 添加媒体播放结束事件 -- 重新播放
mediaElement.MediaEnded += new RoutedEventHandler(media_MediaEnded); // 添加元素卸载完成事件 -- 停止播放
mediaElement.Unloaded += new RoutedEventHandler(media_Unloaded);
} /*
元素事件
*/
private void media_Loaded(object sender, RoutedEventArgs e)
{
(sender as MediaElement).Play();
} private void media_MediaEnded(object sender, RoutedEventArgs e)
{
// MediaElement需要先停止播放才能再开始播放,
// 否则会停在最后一帧不动
(sender as MediaElement).Stop();
(sender as MediaElement).Play();
} private void media_Unloaded(object sender, RoutedEventArgs e)
{
(sender as MediaElement).Stop();
} /*
播放控制按钮的点击事件
*/
private void btnPlay_Click(object sender, RoutedEventArgs e)
{
mediaElement.Play();
} private void btnPause_Click(object sender, RoutedEventArgs e)
{
mediaElement.Pause();
} private void btnStop_Click(object sender, RoutedEventArgs e)
{
mediaElement.Stop();
}

第二种方式:

  注:使用DispatcherTimer,需要添加System.Windows.Threading命名空间。

 XAML:
<MediaElement x:Name="mediaElement" HorizontalAlignment="Left" Height="" Margin="19,10,0,0" VerticalAlignment="Top" Width="" LoadedBehavior ="Manual"/>
<Button x:Name="btnPlay" Content="Play" HorizontalAlignment="Left" Margin="52,270,0,0" VerticalAlignment="Top" Width="" Click="btnPlay_Click"/>
<Button x:Name="btnPause" Content="Pause" HorizontalAlignment="Left" Margin="163,270,0,0" VerticalAlignment="Top" Width="" Click="btnPause_Click"/>
<Button x:Name="btnStop" Content="Stop" HorizontalAlignment="Left" Margin="266,270,0,0" VerticalAlignment="Top" Width="" Click="btnStop_Click"/>
 C#:
DispatcherTimer timer = new DispatcherTimer(); // 定时器timer
int durTime = ; // 视频播放时长,也就是循环周期 // 窗口加载事件
private void Window_Loaded(object sender, RoutedEventArgs e)
{
mediaElement.Source = new Uri("D:/bird.mp4"); // 绑定视频文件 mediaElement.Play(); // 设置启动播放
timer.Interval = new TimeSpan(, , , durTime); // 设置定时器重复周期
timer.Tick += new EventHandler(timerEvent); // 设置定时器事件 timer.Start(); // 启动定时器
} // 定时器事件
public void timerEvent(object sender, EventArgs e)
{
// MediaElement需要先停止播放才能再开始播放,
// 否则会停在最后一帧不动
mediaElement.Stop();
mediaElement.Play();
} /*
播放控制按钮的点击事件
*/
private void btnPlay_Click(object sender, RoutedEventArgs e)
{
mediaElement.Play(); // 开始播放
timer.Start(); // 重新启动定时器
} private void btnPause_Click(object sender, RoutedEventArgs e)
{
mediaElement.Pause(); // 暂停当前播放
timer.Stop(); // 停止定时器
} private void btnStop_Click(object sender, RoutedEventArgs e)
{
mediaElement.Stop(); // 停止当前播放
timer.Stop(); // 停止定时器
}

项目源码下载链接:https://files.cnblogs.com/files/walker-cheng/WpfVideoCyclePlayer.zip

C# WPF 用MediaElement控件实现视频循环播放的更多相关文章

  1. 深入理解MVC C#+HtmlAgilityPack+Dapper走一波爬虫 StackExchange.Redis 二次封装 C# WPF 用MediaElement控件实现视频循环播放 net 异步与同步

    深入理解MVC   MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性 ...

  2. 示例:WPF中Slider控件封装的缓冲播放进度条控件

    原文:示例:WPF中Slider控件封装的缓冲播放进度条控件 一.目的:模仿播放器播放进度条,支持缓冲任务功能 二.进度: 实现类似播放器中带缓存的播放样式(播放区域.缓冲区域.全部区域等样式) 实现 ...

  3. MFC控件实现视频“暂停” “播放”循环

    问static有什么作用,朗朗上口,可是用起来呢 MFC"按钮"控件实现开始显示"播放",按一下之后就开始播放相关视频,并且按钮显示为"暂停" ...

  4. WPF中Ribbon控件的使用

    这篇博客将分享如何在WPF程序中使用Ribbon控件.Ribbon可以很大的提高软件的便捷性. 上面截图使Outlook 2010的界面,在Home标签页中,将所属的Menu都平铺的布局,非常容易的可 ...

  5. WPF 调用WinForm控件

    WPF可以使用WindowsFormsHost控件做为容器去显示WinForm控件,类似的用法网上到处都是,就是拖一个WindowsFormsHost控件winHost1到WPF页面上,让后设置win ...

  6. InteropBitmap指定内存,绑定WPF的Imag控件时刷新问题。

    1.InteropBitmap指定内存,绑定WPF的Imag控件的Source属性 创建InteropBitmap的时候,像素的格式必须为PixelFormats.Bgr32, 如果不是的话在绑定到I ...

  7. 在WPF程序中将控件所呈现的内容保存成图像(转载)

    在WPF程序中将控件所呈现的内容保存成图像 转自:http://www.cnblogs.com/TianFang/archive/2012/10/07/2714140.html 有的时候,我们需要将控 ...

  8. 在wpf中如何让MediaElement的视频循环播放

    原文:在wpf中如何让MediaElement的视频循环播放 MediaElement原始的播放是只播放一遍:如何设置让MediaElement播放 的视频或者音频循环播放,解决如下: 修改Media ...

  9. 【WPF】监听WPF的WebBrowser控件弹出新窗口的事件

    原文:[WPF]监听WPF的WebBrowser控件弹出新窗口的事件 WPF中自带一个WebBrowser控件,当我们使用它打开一个网页,例如百度,然后点击它其中的链接时,如果这个链接是会弹出一个新窗 ...

随机推荐

  1. jdk8 tomcat7

    今天想使用jdk8+tomcat7来个写程序,但是一运行始终提示连接不到数据库 提示:Could not obtain connection metadata org.apache.tomcat.db ...

  2. SharePoint 开发小结

    目标:将sharepoint网站对接Office 365 最直接的API:How to: Add Office 365 APIs to a Visual Studio project http://m ...

  3. 网上流行的linux内核漫画

  4. HYSBZ - 3676

    模板题.问你一个串里最大的值(回文子串*出现次数) /* gyt Live up to every day */ #include<cstdio> #include<cmath> ...

  5. Django之admin管理数据库,cookie验证及分页设置

    一.admin管理数据库 1)models.py创建class类表 class Book(models.Model): name=models.CharField(max_length=) price ...

  6. Keras下的文本情感分析简介。与MLP,RNN,LSTM模型下的文本情感测试

    # coding: utf-8 # In[1]: import urllib.request import os import tarfile # In[2]: url="http://ai ...

  7. [转]图解CSS的padding,margin,border属性(详细介绍及举例说明)

    图解CSS的padding,margin,border属性 W3C组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对像包括段落.列表.标题.图片以及层 ...

  8. 02 Django配置信息

    2-1 基本配置信息 import os # 项目路径 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # ...

  9. Excel2007VBA数组和工作表及单元格的引用

    动态数组使用: https://zhidao.baidu.com/question/1432222709706721499.html 使用Redim动态数组即可. 1 2 3 4 5 6 7 8 Su ...

  10. Mybatis-Plus 实战完整学习笔记(十)------条件构造器核心用法大全(下)

    31.升序orderByAsc 31.升序orderByAsc List<Employee> employeeList = employeeMapper.selectList(new Qu ...