WPF 自己做的视频播放器控件记录一下

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();
        }
    }
}

这种思路解决小文件问题不大,大文件可能就不行了,欢迎大家一起来探讨

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值