<!-- .xmal文件 -->
<Controls:MetroWindow
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" x:Class="spph.VideoPlayingWindow"
Title="视频截图"
Height="600" Width="1000" MinHeight="600" MinWidth="1000"
ShowInTaskbar="False"
WindowStartupLocation="CenterOwner"
GlowBrush="{DynamicResource AccentColorBrush}">
<TabControl x:Name="THREETabControl" Margin="5,5,5,5" >
<TabItem Name="videoTabItem" Header="视频播放" IsSelected="True" Width="198">
<DockPanel Name="dockpanel_Video" LastChildFill="true">
<StackPanel Name="leftPanel_VideoList" DockPanel.Dock="Left" Width="180">
<StackPanel x:Name="InfoPanel">
<TextBlock Text="视频列表" FontSize="20" FontWeight="Bold" FontFamily="Microsoft YaHei" Foreground="#FF434D55" Height="30" HorizontalAlignment="Center" VerticalAlignment="Top" DockPanel.Dock="Top" Margin="10" Width="180" TextAlignment="Center" >
<TextBlock.Background>
<SolidColorBrush Color="#FFFFFFFF"/>
</TextBlock.Background>
</TextBlock>
</StackPanel>
<StackPanel>
<ListView Name="listView_Video" SelectionMode="Single" SelectionChanged="listView_Video_SelectionChanged"></ListView>
</StackPanel>
</StackPanel>
<Grid Background="Azure" Margin="2,2,2,2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="2*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="10*" />
<RowDefinition Height="10*" />
<RowDefinition Height="10*" />
<RowDefinition Height="10*" />
<RowDefinition Height="10*" />
<RowDefinition Height="10*" />
<RowDefinition Height="10*" />
<RowDefinition Height="10*" />
<RowDefinition Height="10*" />
<RowDefinition Height="10*" />
<RowDefinition Height="10*" />
</Grid.RowDefinitions>
<MediaElement Name="mediaElement_Video"
ScrubbingEnabled="True"
LoadedBehavior="Manual"
Volume="{Binding ElementName=volumeSlider, Path=Value}"
Grid.RowSpan="9" Margin="0,5,0,0"
MediaOpened="mediaOpened_Video"
MediaEnded="mediaEnded_Video" Grid.ColumnSpan="9" />
<Slider x:Name="volumeSlider" Minimum="0" Maximum="1" Value="0.5" Width="180" Margin="0,15,12,0" Grid.Row="10" Grid.Column="7" Grid.ColumnSpan="2" />
<Slider x:Name="playSlider" Width="740" Margin="5,-1,5,0" Value ="0" Grid.Row="9" Grid.ColumnSpan="9" ValueChanged="playSlider_ValueChanged" PreviewMouseUp="playSlider_PreviewMouseUp" />
<TextBlock Grid.Row="10" Margin="7,10,0,-2" Name="textBlock_Volumn" Text="音 量" Foreground="#FF9AE500" FontSize="20" Grid.Column="6" />
<TextBlock Grid.Row="9" Grid.Column="7" Margin="44,10,0,0" FontSize="10" Foreground="Gray" Name="textBlock_CurrentTime" />
<TextBlock Grid.Row="9" Grid.Column="8" Margin="0,10,0,0" FontSize="10" Foreground="Gray" Name="textBlock_AllTime" />
<TextBlock Grid.Row="9" Grid.Column="0" Name="textbBock_SpeedInfo"></TextBlock>
<Button Background="{x:Null}" Content="停 止" Cursor="Hand" FontSize="20" Foreground="#FF9AE500" Margin="1,1,1,1" Name="buttonStop" Grid.Row="10" Click="buttonStop_Click" Grid.Column="2" />
<Button Background="{x:Null}" Content="快 退" Cursor="Hand" FontSize="20" Foreground="#FF9AE500" Margin="1,1,1,1" Name="buttonFR" Grid.Row="10" Click="buttonFR_Click" Grid.Column="3" />
<Button Background="{x:Null}" Content="播 放" Cursor="Hand" FontSize="20" Foreground="#FF9AE500" Margin="1,1,1,1" Name="buttonPlay" Grid.Row="10" Click="buttonPlay_Click" Grid.Column="4" />
<Button Background="{x:Null}" Content="快 进" Cursor="Hand" FontSize="20" Foreground="#FF9AE500" Margin="1,1,1,1" Name="buttonFF" Grid.Row="10" Click="buttonFF_Click" Grid.Column="5" />
</Grid>
</DockPanel>
</TabItem>
<TabItem Name="imageTabItem" Header="图片展示" Width="198">
</TabItem>
</TabControl>
</Controls:MetroWindow>
.cs文件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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.Imaging;
using System.Windows.Shapes;
using System.Windows.Threading;
using System.IO;
using System.Threading;
using spph.Model;
using MahApps.Metro.Controls;
namespace spph
{
/// <summary>
/// Interaction logic for VideoPlaying.xaml
/// </summary>
public partial class VideoPlayingWindow : MetroWindow
{
//全局变量 -- 加载视频列表
private List<string> videoList = new List<string>();
//计时器,定时更新进度条和播放时间
private DispatcherTimer tmrProgress = new DispatcherTimer();
//在鼠标拖动Thumb的过程中记录其值。
private TimeSpan ts = new TimeSpan();
public VideoPlayingWindow()
{
InitializeComponent();
InitVideoList();
listView_Video.ItemsSource = videoList;
// this.mediaElement_Video.Play();
tmrProgress = new DispatcherTimer();
//设置计时器的时间间隔为1秒
tmrProgress.Interval = new TimeSpan(0, 0, 1);
//计时器触发事件处理
tmrProgress.Tick += SetDisplayMessage;
SetImageForMediaElement();
}
public void InitVideoList()
{
videoList = new List<string>();
this.mediaElement_Video.LoadedBehavior = MediaState.Manual;
string[] filenames = Directory.GetFiles(LocalData.VideoPath);
foreach (string filename in filenames)
{
if (filename.EndsWith(".mp4"))
{
videoList.Add(filename.Substring(filename.LastIndexOf("\\") + 1));
}
}
this.mediaElement_Video.Source = new Uri(filenames[0]);
this.mediaElement_Video.Play();
}
//将录像的第一帧作为播放前MediaElement显示的录像截图
public void SetImageForMediaElement()
{
mediaElement_Video.Play();
mediaElement_Video.Pause();
mediaElement_Video.Position = TimeSpan.Zero;
}
//计时器触发事件处理
private void SetDisplayMessage(Object sender, System.EventArgs e)
{
if (mediaElement_Video.NaturalDuration.HasTimeSpan)
{
TimeSpan currentPositionTimeSpan = mediaElement_Video.Position;
string currentPosition = string.Format("{0:00}:{1:00}:{2:00}", (int)currentPositionTimeSpan.TotalHours, currentPositionTimeSpan.Minutes, currentPositionTimeSpan.Seconds);
TimeSpan totaotp = mediaElement_Video.NaturalDuration.TimeSpan;
string totalPostion = string.Format("{0:00}:{1:00}:{2:00}", (int)totaotp.TotalHours, totaotp.Minutes, totaotp.Seconds);
textBlock_CurrentTime.Text = currentPosition;
playSlider.Value = mediaElement_Video.Position.TotalSeconds;
}
}
//点击停止按钮相应
private void buttonStop_Click(object sender, EventArgs e)
{
this.mediaElement_Video.Stop();
}
//点击播放按钮
private void buttonPlay_Click(object sender, EventArgs e)
{
//启动计时器 -- 下面这句话尤为重要,缺少滚动条停止,当前时间为00:00:00
//需要修改,当引入播放新的视频时,重新启动计时器
tmrProgress.Start();
if (this.buttonPlay.Content.ToString() == "播 放")
{
this.mediaElement_Video.Play();
this.buttonPlay.Content = "暂 停".ToString();
}
else
{
this.mediaElement_Video.Pause();
this.buttonPlay.Content = "播 放".ToString();
}
}
//点击快进按钮
private void buttonFF_Click(object sender, EventArgs e)
{
this.mediaElement_Video.Position = this.mediaElement_Video.Position + TimeSpan.FromSeconds(10);
textbBock_SpeedInfo.Text = "快进十秒";
textbBock_SpeedInfo.Visibility = Visibility.Visible;
//Thread.Sleep(3000);
textbBock_SpeedInfo.Visibility = Visibility.Hidden;
}
//点击快退按钮
private void buttonFR_Click(object sender, EventArgs e)
{
this.mediaElement_Video.Position = this.mediaElement_Video.Position - TimeSpan.FromSeconds(10);
textbBock_SpeedInfo.Text = "后退十秒";
textbBock_SpeedInfo.Visibility = Visibility.Visible;
//延迟有问题
//Thread.Sleep(3000);
textbBock_SpeedInfo.Visibility = Visibility.Hidden;
}
//TODO现在还不知道MediaElement的MediaOpened和MediaEnded事件的作用
//媒体时关闭,发生
private void mediaEnded_Video(object sender, EventArgs e)
{
mediaElement_Video.Position = TimeSpan.Zero;
mediaElement_Video.Stop();
}
//在加载媒体完成,发生
private void mediaOpened_Video(object sender, EventArgs e)
{
playSlider.Minimum = 0;
playSlider.Maximum = mediaElement_Video.NaturalDuration.TimeSpan.TotalSeconds;
TimeSpan totaotp = mediaElement_Video.NaturalDuration.TimeSpan;
textBlock_AllTime.Text = "/" + string.Format("{0:00}:{1:00}:{2:00}", (int)totaotp.TotalHours, totaotp.Minutes, totaotp.Seconds);
textBlock_CurrentTime.Text = "00:00:00";
}
//拖拉播放进度 -- 设置
private void playSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
ts = TimeSpan.FromSeconds(e.NewValue);
string currentPosition = string.Format("{0:00}:{1:00}:{2:00}", (int)ts.TotalHours, ts.Minutes, ts.Seconds);
textBlock_CurrentTime.Text = currentPosition;
}
//当拖动Thumb的鼠标放开时,从指定时间开始播放
private void playSlider_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
mediaElement_Video.Position = ts;
}
//点击右侧视频,加以播放
private void listView_Video_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
string fileName = this.listView_Video.SelectedValue.ToString();
this.mediaElement_Video.Source = new Uri( LocalData.VideoPath + "//" + fileName);
this.mediaElement_Video.Play();
}
}
}