- 前端xaml模块
<Window x:Class="Wpf_new.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:Wpf_new"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="500">
<Grid >
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height=" auto"/>
<RowDefinition Height=" auto"/>
</Grid.RowDefinitions><!--设置成三行-->
<MediaElement x:Name="_MediaElement" LoadedBehavior="Manual"/> <!--播放器命名为_MediaElement,方便后端调用-->
<Border x:Name="_Border" Background="pink">
<TextBlock x:Name="_TextBlock" Foreground="Black" Text="播放器" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<StackPanel Grid.Row="1" Orientation="Horizontal">
<Button Content="打开" Width=" 60" Height=" 25" Margin=" 5" Click="OpenMedia" />
<Button Content="播放" Width=" 60" Height=" 25" Margin=" 5" Click="PlayMedia" />
<Button Content="暂停" Width=" 60" Height=" 25" Margin=" 5" Click="StopMedia" />
<Button Content="后退" Width=" 60" Height=" 25" Margin=" 5" Click="BackMedia" />
<Button Content="快进" Width=" 60" Height=" 25" Margin=" 5" Click="ForwardMedia" /><!-- 设置点击事件-->
<TextBlock Text="音量" Width=" 60" Height=" 25" Margin=" 5"/>
<Slider x:Name="_Slider" Minimum="0" Maximum="100" Value="25" Width=" 120" VerticalAlignment="Center" HorizontalAlignment="Center" ValueChanged="_Slider_ValueChanged"/><!--利用滑块Slider设置音量键,最大值为100,最小值为0,当前值为25,ValueChanged是一个事件处理程序的绑定,当滑块的值发生变化时会触发-->
</StackPanel>
<Grid Grid.Row="2">
<ProgressBar x:Name="_ProgressBar" Height=" 10" Margin="5"/><!--设置进度条-->
</Grid>
</Grid>
</Window>
* 页面展示

- 后端cs模块
using System;
using System.Collections.Specialized;
using System.ComponentModel;
using System.IO;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Threading;
namespace Wpf_new
{
public partial class MainWindow : Window
{
private string file =string.Empty;<!--定义一个字符串变量file,用来保存打开的媒体文件的路径-->
public MainWindow()
{
InitializeComponent();//每当创建MainWindow类的实例时会执行这个构造函数。InitializeComponent()用于初始化窗口及其所有控件。
// 订阅 MediaOpened 事件以设置进度条的最大值
_MediaElement.MediaOpened += (s, e) => //利用匿名函数的lambda表达式
{
if (_MediaElement.NaturalDuration.HasTimeSpan)//判断媒体文件是否有有效的时间长度
{
var ts = _MediaElement.NaturalDuration.TimeSpan;//从 NaturalDuration 属性中获取一个 TimeSpan 对象,它代表了媒体文件的实际持续时间。
_ProgressBar.Maximum = ts.TotalMilliseconds;//设置播放进度条的总长度(将进度条 (_ProgressBar) 的最大值设置为媒体文件总时长的毫秒数。这意味着进度条的范围将与媒体文件的长度相对应,使得用户可以通过查看进度条了解当前播放位置和剩余时间。)
}
};
DispatcherTimer timer = new DispatcherTimer();//创建了一个计时器DispatcherTimer,每500毫秒更新一次进度条的位置,确保进度条与当前播放的位置同步
timer.Interval = TimeSpan.FromMilliseconds(500); // 更新间隔调整为 500ms
timer.Tick += (s, e) =>
{
if (_MediaElement.NaturalDuration.HasTimeSpan && _MediaElement.Source != null)
//检查媒体文件是否有一个有效的时间跨度&&检查媒体播放器是否已经加载了有效的媒体源文件
{
var ts = _MediaElement.Position;//获取当前媒体播放位置,并将其赋值给变量 ts
_ProgressBar.Value = Math.Min(ts.TotalMilliseconds, _ProgressBar.Maximum);
//计算当前播放位置(转换成毫秒数)和进度条最大值之间的最小值。这样做是为了防止进度条的值超出它的最大限制.
}
};
timer.Start();//启动定时器。
}
private void OpenMedia(object sender, RoutedEventArgs e)
{
var openFileDialog = new Microsoft.Win32.OpenFileDialog()//创建一个打开文件对话框实例
{
Filter = "视频文件(.mp4)|*.mp4",//设定对话框中允许打开的文件类型,这里是.mp4文件
Multiselect = false ,//不允许用户选择多个文件
};
var result = openFileDialog.ShowDialog ();//显示对话框并等待用户选择文件,返回结果
if (result == true )
{
file = openFileDialog.FileName;//将选择的文件路径保存到file变量中
_MediaElement.MediaEnded -= _MediaElement_MediaEnded;//移除任何已存在的MediaEnded事件处理程序(防止重复订阅)。
_MediaElement.MediaEnded += _MediaElement_MediaEnded;//在媒体播放结束时触发的方法
_MediaElement.Source = new System.Uri(file);
this.Title = file;
_TextBlock.Text = file;
}
}
private void _MediaElement_MediaEnded(object sender, RoutedEventArgs e)
{
if (_MediaElement.NaturalDuration.HasTimeSpan)
{
var ts = _MediaElement.NaturalDuration.TimeSpan ;
_ProgressBar .Maximum = ts.TotalMilliseconds ;
}
}
private void PlayMedia(object sender, RoutedEventArgs e)//播放
{
_MediaElement.Play();
_Border.Visibility = Visibility.Collapsed;//隐藏包含“播放器”文本的边框
}
private void StopMedia(object sender, RoutedEventArgs e)//暂停
{
_MediaElement.Pause();
}
private void BackMedia(object sender, RoutedEventArgs e)//快进
{
_MediaElement.Position = _MediaElement.Position-TimeSpan.FromSeconds(10);
}
private void ForwardMedia(object sender, RoutedEventArgs e)//后退
{
_MediaElement.Position = _MediaElement.Position + TimeSpan.FromSeconds(10);
}
private void _Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)//音量调节
{
_MediaElement .Volume = _Slider.Value;
}
}
}