WPF 自己做的视频播放器控件记录一下
最近公司要做一个播放视频的业务,花了点事件做了个控件,记录一下方便以后使用
效果图
视频控件页面代码 PlayMediaControl1.xaml.cs
<UserControl x:Class="System.Content.ProductReview.PlayMediaControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:System.Content.ProductReview"
mc:Ignorable="d"
d:DesignHeight="200" Background="Black" d:DesignWidth="300">
<UserControl.Resources>
<SolidColorBrush x:Key="SliderThumb.Static.Foreground" Color="#FFE5E5E5"/>
<SolidColorBrush x:Key="SliderThumb.MouseOver.Background" Color="#FFDCECFC"/>
<SolidColorBrush x:Key="SliderThumb.MouseOver.Border" Color="#FF7Eb4EA"/>
<SolidColorBrush x:Key="SliderThumb.Pressed.Background" Color="#FFDAECFC"/>
<SolidColorBrush x:Key="SliderThumb.Pressed.Border" Color="#FF569DE5"/>
<SolidColorBrush x:Key="SliderThumb.Disabled.Background" Color="#FFF0F0F0"/>
<SolidColorBrush x:Key="SliderThumb.Disabled.Border" Color="#FFD9D9D9"/>
<SolidColorBrush x:Key="SliderThumb.Static.Background" Color="#FFF0F0F0"/>
<SolidColorBrush x:Key="SliderThumb.Static.Border" Color="#FFACACAC"/>
<ControlTemplate x:Key="SliderThumbHorizontalTop" TargetType="{x:Type Thumb}">
<Grid HorizontalAlignment="Center" UseLayoutRounding="True" VerticalAlignment="Center">
<Path x:Name="grip" Data="M 0,6 C0,6 5.5,0 5.5,0 5.5,0 11,6 11,6 11,6 11,18 11,18 11,18 0,18 0,18 0,18 0,6 0,6 z" Fill="{StaticResource SliderThumb.Static.Background}" Stretch="Fill" SnapsToDevicePixels="True" Stroke="{StaticResource SliderThumb.Static.Border}" StrokeThickness="1" UseLayoutRounding="True" VerticalAlignment="Center"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Background}"/>
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Border}"/>
</Trigger>
<Trigger Property="IsDragging" Value="true">
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Background}"/>
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Border}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Background}"/>
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Border}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<ControlTemplate x:Key="SliderThumbHorizontalBottom" TargetType="{x:Type Thumb}">
<Grid HorizontalAlignment="Center" UseLayoutRounding="True" VerticalAlignment="Center">
<Path x:Name="grip" Data="M 0,12 C0,12 5.5,18 5.5,18 5.5,18 11,12 11,12 11,12 11,0 11,0 11,0 0,0 0,0 0,0 0,12 0,12 z" Fill="{StaticResource SliderThumb.Static.Background}" Stretch="Fill" SnapsToDevicePixels="True" Stroke="{StaticResource SliderThumb.Static.Border}" StrokeThickness="1" UseLayoutRounding="True" VerticalAlignment="Center"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Background}"/>
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Border}"/>
</Trigger>
<Trigger Property="IsDragging" Value="true">
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Background}"/>
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Border}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Background}"/>
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Border}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<SolidColorBrush x:Key="SliderThumb.Track.Border" Color="#FFD6D6D6"/>
<SolidColorBrush x:Key="SliderThumb.Track.Background" Color="#FFE7EAEA"/>
<Style x:Key="RepeatButtonTransparent" TargetType="{x:Type RepeatButton}">
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Focusable" Value="false"/>
<Setter Property="IsTabStop" Value="false"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type RepeatButton}">
<Rectangle Fill="{TemplateBinding Background}" Height="{TemplateBinding Height}" Width="{TemplateBinding Width}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<ControlTemplate x:Key="SliderThumbHorizontalDefault" TargetType="{x:Type Thumb}">
<Grid HorizontalAlignment="Center" UseLayoutRounding="True" VerticalAlignment="Center">
<!--<Path x:Name="grip" Data="M 0,5 C0,0 11,0 11,0 11,0 11,18 11,18 11,18 0,18 0,18 0,18 0,0 0,5 z" Fill="{StaticResource SliderThumb.Static.Background}" Stretch="Fill" SnapsToDevicePixels="True" Stroke="{StaticResource SliderThumb.Static.Border}" StrokeThickness="1" UseLayoutRounding="True" VerticalAlignment="Center"/>-->
<Path x:Name="grip" Fill="CornflowerBlue" Stretch="Fill" SnapsToDevicePixels="True" Stroke="White" StrokeThickness="3" UseLayoutRounding="True" VerticalAlignment="Center">
<Path.Data>
<EllipseGeometry Center="5,5" RadiusX="2" RadiusY="2"/>
</Path.Data>
</Path>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Background}"/>
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Border}"/>
</Trigger>
<Trigger Property="IsDragging" Value="true">
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Background}"/>
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Border}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Background}"/>
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Border}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<ControlTemplate x:Key="SliderHorizontal" TargetType="{x:Type Slider}">
<Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto" MinHeight="{TemplateBinding MinHeight}"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TickBar x:Name="TopTick" Fill="{TemplateBinding Foreground}" Height="4" Margin="0,0,0,2" Placement="Top" Grid.Row="0" Visibility="Collapsed"/>
<TickBar x:Name="BottomTick" Fill="{TemplateBinding Foreground}" Height="4" Margin="0,2,0,0" Placement="Bottom" Grid.Row="2" Visibility="Collapsed"/>
<Border x:Name="TrackBackground" Background="{StaticResource SliderThumb.Track.Background}" Height="4.0" Margin="5,0" Grid.Row="1" VerticalAlignment="center">
<Canvas Margin="-6,-1">
<Rectangle x:Name="PART_SelectionRange" Fill="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" Height="4.0" Visibility="Hidden"/>
</Canvas>
</Border>
<Track x:Name="PART_Track" Grid.Row="1">
<Track.DecreaseRepeatButton>
<RepeatButton Command="{x:Static Slider.DecreaseLarge}" Background="CornflowerBlue" Height="4" Style="{StaticResource RepeatButtonTransparent}"/>
</Track.DecreaseRepeatButton>
<Track.IncreaseRepeatButton>
<RepeatButton Command="{x:Static Slider.IncreaseLarge}" Style="{StaticResource RepeatButtonTransparent}"/>
</Track.IncreaseRepeatButton>
<Track.Thumb>
<Thumb x:Name="Thumb" Focusable="False" Height="10" OverridesDefaultStyle="True" Template="{StaticResource SliderThumbHorizontalDefault}" VerticalAlignment="Center" Width="10"/>
</Track.Thumb>
</Track>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="TickPlacement" Value="TopLeft">
<Setter Property="Visibility" TargetName="TopTick" Value="Visible"/>
<Setter Property="Template" TargetName="Thumb" Value="{StaticResource SliderThumbHorizontalTop}"/>
<Setter Property="Margin" TargetName="TrackBackground" Value="5,2,5,0"/>
</Trigger>
<Trigger Property="TickPlacement" Value="BottomRight">
<Setter Property="Visibility" TargetName="BottomTick" Value="Visible"/>
<Setter Property="Template" TargetName="Thumb" Value="{StaticResource SliderThumbHorizontalBottom}"/>
<Setter Property="Margin" TargetName="TrackBackground" Value="5,0,5,2"/>
</Trigger>
<Trigger Property="TickPlacement" Value="Both">
<Setter Property="Visibility" TargetName="TopTick" Value="Visible"/>
<Setter Property="Visibility" TargetName="BottomTick" Value="Visible"/>
</Trigger>
<Trigger Property="IsSelectionRangeEnabled" Value="true">
<Setter Property="Visibility" TargetName="PART_SelectionRange" Value="Visible"/>
</Trigger>
<Trigger Property="IsKeyboardFocused" Value="true">
<Setter Property="Foreground" TargetName="Thumb" Value="Blue"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<ControlTemplate x:Key="SliderThumbVerticalLeft" TargetType="{x:Type Thumb}">
<Grid HorizontalAlignment="Center" UseLayoutRounding="True" VerticalAlignment="Center">
<Path x:Name="grip" Data="M 6,11 C6,11 0,5.5 0,5.5 0,5.5 6,0 6,0 6,0 18,0 18,0 18,0 18,11 18,11 18,11 6,11 6,11 z" Fill="{StaticResource SliderThumb.Static.Background}" Stretch="Fill" Stroke="{StaticResource SliderThumb.Static.Border}"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Background}"/>
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Border}"/>
</Trigger>
<Trigger Property="IsDragging" Value="true">
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Background}"/>
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Border}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Background}"/>
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Border}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<ControlTemplate x:Key="SliderThumbVerticalRight" TargetType="{x:Type Thumb}">
<Grid HorizontalAlignment="Center" UseLayoutRounding="True" VerticalAlignment="Center">
<Path x:Name="grip" Data="M 12,11 C12,11 18,5.5 18,5.5 18,5.5 12,0 12,0 12,0 0,0 0,0 0,0 0,11 0,11 0,11 12,11 12,11 z" Fill="{StaticResource SliderThumb.Static.Background}" Stretch="Fill" Stroke="{StaticResource SliderThumb.Static.Border}"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Background}"/>
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Border}"/>
</Trigger>
<Trigger Property="IsDragging" Value="true">
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Background}"/>
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Border}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Background}"/>
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Border}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<ControlTemplate x:Key="SliderThumbVerticalDefault" TargetType="{x:Type Thumb}">
<Grid HorizontalAlignment="Center" UseLayoutRounding="True" VerticalAlignment="Center">
<Path x:Name="grip" Data="M0.5,0.5 L18.5,0.5 18.5,11.5 0.5,11.5z" Fill="{StaticResource SliderThumb.Static.Background}" Stretch="Fill" Stroke="{StaticResource SliderThumb.Static.Border}"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Background}"/>
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Border}"/>
</Trigger>
<Trigger Property="IsDragging" Value="true">
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Background}"/>
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Border}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Background}"/>
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Border}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<ControlTemplate x:Key="SliderVertical" TargetType="{x:Type Slider}">
<Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition MinWidth="{TemplateBinding MinWidth}" Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TickBar x:Name="TopTick" Grid.Column="0" Fill="{TemplateBinding Foreground}" Margin="0,0,2,0" Placement="Left" Visibility="Collapsed" Width="4"/>
<TickBar x:Name="BottomTick" Grid.Column="2" Fill="{TemplateBinding Foreground}" Margin="2,0,0,0" Placement="Right" Visibility="Collapsed" Width="4"/>
<Border x:Name="TrackBackground" BorderBrush="{StaticResource SliderThumb.Track.Border}" BorderThickness="1" Background="{StaticResource SliderThumb.Track.Background}" Grid.Column="1" HorizontalAlignment="center" Margin="0,5" Width="4.0">
<Canvas Margin="-1,-6">
<Rectangle x:Name="PART_SelectionRange" Fill="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" Visibility="Hidden" Width="4.0"/>
</Canvas>
</Border>
<Track x:Name="PART_Track" Grid.Column="1">
<Track.DecreaseRepeatButton>
<RepeatButton Command="{x:Static Slider.DecreaseLarge}" Style="{StaticResource RepeatButtonTransparent}"/>
</Track.DecreaseRepeatButton>
<Track.IncreaseRepeatButton>
<RepeatButton Command="{x:Static Slider.IncreaseLarge}" Style="{StaticResource RepeatButtonTransparent}"/>
</Track.IncreaseRepeatButton>
<Track.Thumb>
<Thumb x:Name="Thumb" Focusable="False" Height="11" OverridesDefaultStyle="True" Template="{StaticResource SliderThumbVerticalDefault}" VerticalAlignment="Top" Width="18"/>
</Track.Thumb>
</Track>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="TickPlacement" Value="TopLeft">
<Setter Property="Visibility" TargetName="TopTick" Value="Visible"/>
<Setter Property="Template" TargetName="Thumb" Value="{StaticResource SliderThumbVerticalLeft}"/>
<Setter Property="Margin" TargetName="TrackBackground" Value="2,5,0,5"/>
</Trigger>
<Trigger Property="TickPlacement" Value="BottomRight">
<Setter Property="Visibility" TargetName="BottomTick" Value="Visible"/>
<Setter Property="Template" TargetName="Thumb" Value="{StaticResource SliderThumbVerticalRight}"/>
<Setter Property="Margin" TargetName="TrackBackground" Value="0,5,2,5"/>
</Trigger>
<Trigger Property="TickPlacement" Value="Both">
<Setter Property="Visibility" TargetName="TopTick" Value="Visible"/>
<Setter Property="Visibility" TargetName="BottomTick" Value="Visible"/>
</Trigger>
<Trigger Property="IsSelectionRangeEnabled" Value="true">
<Setter Property="Visibility" TargetName="PART_SelectionRange" Value="Visible"/>
</Trigger>
<Trigger Property="IsKeyboardFocused" Value="true">
<Setter Property="Foreground" TargetName="Thumb" Value="Blue"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<Style x:Key="SliderStyle1" TargetType="{x:Type Slider}">
<Setter Property="Stylus.IsPressAndHoldEnabled" Value="false"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="Foreground" Value="{StaticResource SliderThumb.Static.Foreground}"/>
<Setter Property="Template" Value="{StaticResource SliderHorizontal}"/>
<Style.Triggers>
<Trigger Property="Orientation" Value="Vertical">
<Setter Property="Template" Value="{StaticResource SliderVertical}"/>
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<Grid x:Name="allView">
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="8*"></RowDefinition>
<RowDefinition Height="1.5*"></RowDefinition>
</Grid.RowDefinitions>
<MediaElement Grid.Row="1" MediaEnded="MediaElement_MediaEnded" ScriptCommand="MediaElement_ScriptCommand" MediaOpened="MediaElement_MediaOpened" x:Name="mediaElement" LoadedBehavior="Manual"/>
<Image x:Name="bigPlay" Grid.Row="1" MouseLeftButtonDown="BigPlay_MouseLeftButtonDown" Width="80" Height="80" Source="/System;component/Images/icon_media_play.png" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="5" />
<Grid Grid.Row="2" Margin="10,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Image Name="play_pause" Margin="2,5" Height="15" Tag="pause" MouseLeftButtonDown="Play_pause_MouseLeftButtonDown" Source="/System;component/Images/icon_media_play1.png" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBlock x:Name="newTime" Margin="2" Grid.Column="1" Foreground="LightSlateGray" HorizontalAlignment="Center" VerticalAlignment="Center" >00:00</TextBlock>
<Slider Margin="2" x:Name="mediaSlider" ValueChanged="MediaSlider_ValueChanged" Grid.Column="2" Maximum="100" Value="0" Style="{DynamicResource SliderStyle1}" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Name="allTime" Margin="2" Grid.Column="3" Foreground="LightSlateGray" HorizontalAlignment="Center" VerticalAlignment="Center" >00:00</TextBlock>
<Image x:Name="voice_but" Height="15" Margin="2,5" Grid.Column="4" MouseLeftButtonDown="Voice_but_MouseLeftButtonDown" Source="/System;component/Images/icon_media_voice1.png" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<Slider x:Name="voice_Slider" Margin="2" MinWidth="50" ValueChanged="Voice_Slider_ValueChanged" Grid.Column="5" Maximum="1" Value="{Binding MediaVoice, Mode=TwoWay}" Style="{DynamicResource SliderStyle1}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<Image x:Name="windowMaxMin" Tag="min" Height="15" MouseLeftButtonDown="WindowMaxMin_MouseLeftButtonDown" Margin="2,5" Grid.Column="6" Source="/System;component/Images/icon_media_tomax.png" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Grid>
</UserControl>
视频控件代码 PlayMediaControl1.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
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.Navigation;
using System.Windows.Shapes;
namespace System.Content.ProductReview
{
public enum windowType
{
min,
max
}
/// <summary>
/// PlayMediaControl1.xaml 的交互逻辑
/// </summary>
public partial class PlayMediaControl1 : UserControl
{
Timer timer;//时间迭代器
Action action;
#region 属性
public bool isplaying
{
get ;
set;
}
/// <summary>
/// 视频默认开始位置
/// </summary>
private TimeSpan position;
public TimeSpan Position
{
get { return position; }
set
{
position = value;
try
{
mediaElement.Position = position;
}
catch (Exception)
{
}
}
}
/// <summary>
/// 大小模式
/// </summary>
private windowType windowType = windowType.min;
public windowType WindowType
{
get { return windowType; }
set
{
windowType = value;
if (value==windowType.max)
{
windowMaxMin.Source = new BitmapImage(new Uri("pack://application:,,,/Images/icon_media_tomin.png"));
windowMaxMin.Tag = "max";
}
}
}
/// <summary>
/// 视频地址
/// </summary>
private String urlPath;
public String UrlPath
{
get { return urlPath; }
set { urlPath = value;
//设置视频路径
Console.WriteLine("设置视频路径" + urlPath);
mediaElement.Source = new Uri(urlPath);
}
}
/// <summary>
/// 视频音量
/// </summary>
public double MediaVoice
{
get { return mediaElement.Volume; }
set { mediaElement.Volume = value; }
}
#endregion
public PlayMediaControl1()
{
InitializeComponent();
this.DataContext = this;
action = new Action(() =>
{
mediaSlider.Value = mediaElement.Position.TotalSeconds;
newTime.Text = mediaElement.Position.Minutes.ToString("00") + ":" + mediaElement.Position.Seconds.ToString("00");
});
}
#region 事件
/// <summary>
/// 关闭按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MClose_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
mediaSlider.Value = mediaElement.Position.TotalSeconds;
newTime.Text = mediaElement.Position.Minutes.ToString("00") + ":" + mediaElement.Position.Seconds.ToString("00");
}
/// <summary>
/// 点击播放暂停
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Play_pause_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Image image = (Image)sender;
if (image.Tag.Equals("pause"))//--》播放
{
mediaElement.Play();
showPlayView();
}
else//-->暂停
{
mediaElement.Pause();
showPauseView();
}
}
/// <summary>
/// 视频进度条发送变化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MediaSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
mediaElement.Position = TimeSpan.FromSeconds(mediaSlider.Value);
}
/// <summary>
/// 当声音进度条发现改变
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Voice_Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
mediaElement.Volume = voice_Slider.Value;
}
/// <summary>
/// 视频加载完成
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MediaElement_MediaOpened(object sender, RoutedEventArgs e)
{
try
{
Console.WriteLine("视频加载完成");
mediaSlider.Maximum = mediaElement.NaturalDuration.TimeSpan.TotalSeconds;
allTime.Text = mediaElement.NaturalDuration.TimeSpan.Minutes.ToString("00")+":"+ mediaElement.NaturalDuration.TimeSpan.Seconds.ToString("00");
if (Position!=null)
{
try
{
mediaElement.Position = position;
}
catch (Exception)
{
}
}
}
catch (Exception)
{
}
}
/// <summary>
/// 是否是静音
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Voice_but_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (mediaElement.IsMuted)//静音模式--》有声模式
{
voice_but.Source = new BitmapImage(new Uri("pack://application:,,,/Images/icon_media_voice1.png"));
mediaElement.IsMuted = false;
voice_Slider.IsEnabled = true;
}
else//有声模式--》静音模式
{
voice_but.Source = new BitmapImage(new Uri("pack://application:,,,/Images/icon_media_voice0.png"));
mediaElement.IsMuted = true;
voice_Slider.IsEnabled = false;
}
}
/// <summary>
/// 点击缩小放大时的代码
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void WindowMaxMin_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (windowType==windowType.min)//小模式--》大模式
{
PlayVideo playVideo = new PlayVideo();//大窗口
//显示大窗口之前的准备工作
playVideo.media.UrlPath = urlPath;//传递路径
playVideo.media.Position = mediaElement.Position;//同步进度
playVideo.media.mediaElement.IsMuted = mediaElement.IsMuted;//是否是静音
playVideo.media.mediaElement.Volume = mediaElement.Volume;//音量
playVideo.media.mediaSlider.Maximum = mediaSlider.Maximum;//视频进度条
playVideo.media.mediaSlider.Value = mediaSlider.Value;//视频进度条
playVideo.media.voice_Slider.Maximum = voice_Slider.Maximum;//声音进度条
playVideo.media.voice_Slider.Value = voice_Slider.Value;//声音进度条
playVideo.media.voice_Slider.IsEnabled = voice_Slider.IsEnabled;//声音进度条
playVideo.media.voice_but.Tag = voice_but.Tag;//静音Tag
playVideo.media.voice_but.Source = voice_but.Source;//静音图片
//同步播放状态
if (isplaying)
{
playVideo.media.mediaElement.Play();
playVideo.media.showPlayView();
}
else
{
playVideo.media.showPauseView();
}
mediaElement.Pause();//暂停本地
showPauseView();//调整为暂停样式
allView.Visibility = Visibility.Hidden;//隐藏
//显示大窗口
playVideo.ShowDialog();
//关闭大窗口之后的工作
mediaElement.Position = playVideo.media.mediaElement.Position;//进度
mediaElement.IsMuted = playVideo.media.mediaElement.IsMuted;//是否是静音
mediaElement.Volume = playVideo.media.mediaElement.Volume;//音量
mediaSlider.Maximum = playVideo.media.mediaSlider.Maximum;//视频进度条
mediaSlider.Value = playVideo.media.mediaSlider.Value;//视频进度条
voice_Slider.Maximum = playVideo.media.voice_Slider.Maximum;//声音进度条
voice_Slider.Value = playVideo.media.voice_Slider.Value;//声音进度条
voice_Slider.IsEnabled = playVideo.media.voice_Slider.IsEnabled;//声音进度条
voice_but.Tag = playVideo.media.voice_but.Tag;//静音Tag
voice_but.Source = playVideo.media.voice_but.Source;//静音图片
if (playVideo.media.isplaying)//同步播放状态
{
mediaElement.Play();
showPlayView();
}
else
{
showPauseView();
}
allView.Visibility = Visibility.Visible;//显示
}
else//大模式--》小模式
{
//通知PlayVideo关闭
if (closeWindow!=null)
closeWindow?.Invoke();
}
}
//播放结束
private void MediaElement_MediaEnded(object sender, RoutedEventArgs e)
{
//设置视频路径
//Console.WriteLine("设置视频路径" + urlPath);
//mediaElement.Source = new Uri(urlPath);
//mediaElement.Position = new TimeSpan();
mediaSlider.Value = 0;
newTime.Text = "00:00";
mediaElement.Stop();
showPauseView();
}
/// <summary>
/// 播放错误
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MediaElement_ScriptCommand(object sender, MediaScriptCommandRoutedEventArgs e)
{
showPauseView();
MessageBox.Show("播放错误");
}
/// <summary>
/// 屏幕播放按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BigPlay_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
mediaElement.Play();
showPlayView();
}
/// <summary>
/// 暂停时的布局显示
/// </summary>
private void showPauseView()
{
bigPlay.Visibility = Visibility.Visible;
play_pause.Source = new BitmapImage(new Uri("pack://application:,,,/Images/icon_media_play1.png"));
play_pause.Tag = "pause";
isplaying = false;
if (timer!=null)
{
timer.Enabled = false;
timer.Stop();
timer.Close();
timer = null;
}
}
/// <summary>
/// 播放时的布局显示
/// </summary>
private void showPlayView()
{
bigPlay.Visibility = Visibility.Collapsed;
play_pause.Source = new BitmapImage(new Uri("pack://application:,,,/Images/icon_media_pause1.png"));
play_pause.Tag = "play";
isplaying = true;
if (timer!=null)
{
timer.Enabled = false;
timer.Stop();
timer.Close();
timer = null;
}
timer = new Timer(100);
timer.Enabled = true;//是否执行
timer.Elapsed += Timer_Elapsed;//执行的事件
timer.Start();
}
/// <summary>
/// 延时器执行的代码
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
mediaSlider.Dispatcher.Invoke(action);
//VideoPressage = 0;
}
#endregion
#region 方法
/// <summary>
/// 停止并重置媒体使其从头播放。
/// </summary>
public void stopMedia()
{
newTime.Text = "00:00";
mediaSlider.Value = 0;
mediaElement.Stop();
showPauseView();
}
/// <summary>
/// 从当前位置播放媒体。
/// </summary>
public void playMedia()
{
mediaElement.Play();
showPlayView();
}
/// <summary>
/// 在当前位置暂停媒体。
/// </summary>
public void pauseMedia()
{
mediaElement.Pause();
showPauseView();
}
/// <summary>
/// 关闭媒体。
/// </summary>
public void closeMedia()
{
mediaElement.Close();
showPauseView();
}
#endregion
public delegate void CloseWindow();
private CloseWindow closeWindow;
public void closeWin(CloseWindow close)
{
this.closeWindow = close;
}
}
}
放大的解决思路是创建一个页面,将一些参数传递过去,取消放大状态时在将实时数据返回,所以还有个页面(放大后的页面)
放大页面WPF代码 PlayVideo.xaml
<Window x:Class="System.Content.ProductReview.PlayVideo"
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:System.Content.ProductReview"
mc:Ignorable="d"
Title="PlayVideo" Height="450" Width="800" WindowStyle="None" AllowsTransparency="True" WindowStartupLocation="CenterScreen">
<Grid>
<local:PlayMediaControl1 x:Name="media" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
<Image Name="mClose" Height="20" Width="20" Source="/System;component/Images/close1.png" MouseLeftButtonDown="MClose_MouseLeftButtonDown" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="10" />
</Grid>
</Window>
放大页面C#代码 PlayVideo.xaml.cs
using System;
using System.Collections.Generic;
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.Imaging;
using System.Windows.Shapes;
namespace System.Content.ProductReview
{
/// <summary>
/// PlayVideo.xaml 的交互逻辑
/// </summary>
public partial class PlayVideo : Window
{
public PlayVideo()
{
InitializeComponent();
//media.windowMaxMin.
media.WindowType = windowType.max;
media.closeWin(CloseThis);
}
public void Path(string path) {
media.UrlPath = path;
}
public void CloseThis()
{
this.Close();
}
private void MClose_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
CloseThis();
}
}
}
这种思路解决小文件问题不大,大文件可能就不行了,欢迎大家一起来探讨