基于MVVM的视屏播放器 windowsphone版

直接上代码了  自己理解去吧

VideoPlayer.xaml
<phone:PhoneApplicationPage
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
    xmlns:interactions="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions"
    xmlns:SimpleMvvmToolkit="clr-namespace:SimpleMvvmToolkit;assembly=SimpleMvvmToolkit-WP7" 
    x:Class="Think.MTV.Views.VideoPlayer"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Landscape" Orientation="Landscape"
    mc:Ignorable="d" d:DesignHeight="480" d:DesignWidth="800"
    DataContext="{Binding VideoPlayerViewModel,Source={StaticResource Locator}}"
    shell:SystemTray.IsVisible="False">
    <i:Interaction.Triggers>
                <i:EventTrigger>
                    <SimpleMvvmToolkit:EventToCommand Command="{Binding LoadCommand, Mode=OneWay}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
   
    <!--LayoutRoot 是包含所有页面内容的根网格-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
       <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="PlayPauseButtons">
            <VisualState x:Name="PlayButtonOn">
                <!-- Switch to play button storyboard -->
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="PauseButton">
                        <DiscreteObjectKeyFrame KeyTime="0:0:0.2">
                            <DiscreteObjectKeyFrame.Value>
                                <Visibility>
                                    Visible
                                </Visibility>
                            </DiscreteObjectKeyFrame.Value>
                        </DiscreteObjectKeyFrame>
                        <DiscreteObjectKeyFrame KeyTime="0:0:0.5">
                            <DiscreteObjectKeyFrame.Value>
                                <Visibility>
                                    Collapsed
                                </Visibility>
                            </DiscreteObjectKeyFrame.Value>
                        </DiscreteObjectKeyFrame>
                    </ObjectAnimationUsingKeyFrames>
                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="PlayButton">
                        <DiscreteObjectKeyFrame KeyTime="0:0:0.5">
                            <DiscreteObjectKeyFrame.Value>
                                <Visibility>
                                    Visible
                                </Visibility>
                            </DiscreteObjectKeyFrame.Value>
                        </DiscreteObjectKeyFrame>
                    </ObjectAnimationUsingKeyFrames>
                </Storyboard>
            </VisualState>
            <VisualState x:Name="PauseButtonOn">
                <!-- Switch to pause button storyboard -->
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="PlayButton">
                        <DiscreteObjectKeyFrame KeyTime="0:0:0.2">
                            <DiscreteObjectKeyFrame.Value>
                                <Visibility>
                                    Visible
                                </Visibility>
                            </DiscreteObjectKeyFrame.Value>
                        </DiscreteObjectKeyFrame>
                        <DiscreteObjectKeyFrame KeyTime="0:0:0.5">
                            <DiscreteObjectKeyFrame.Value>
                                <Visibility>
                                    Collapsed
                                </Visibility>
                            </DiscreteObjectKeyFrame.Value>
                        </DiscreteObjectKeyFrame>
                    </ObjectAnimationUsingKeyFrames>
                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="PauseButton">
                        <DiscreteObjectKeyFrame KeyTime="0:0:0.5">
                            <DiscreteObjectKeyFrame.Value>
                                <Visibility>
                                    Visible
                                </Visibility>
                            </DiscreteObjectKeyFrame.Value>
                        </DiscreteObjectKeyFrame>
                    </ObjectAnimationUsingKeyFrames>
                </Storyboard>
            </VisualState>
        </VisualStateGroup>
     
        
        <VisualStateGroup x:Name="PlayerControlsAnimations">
            <VisualState x:Name="PlayerControlsBoxHidden">
                <!-- Hide controls storyboard -->
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" 
                    Storyboard.TargetName="PlayerControls">
                        <DiscreteObjectKeyFrame KeyTime="0:0:0.1">
                            <DiscreteObjectKeyFrame.Value>
                                <Visibility>
                                    Collapsed
                                </Visibility>
                            </DiscreteObjectKeyFrame.Value>
                        </DiscreteObjectKeyFrame>
                    </ObjectAnimationUsingKeyFrames>
                    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 
                    Storyboard.TargetName="PlayerControls">
                        <EasingDoubleKeyFrame KeyTime="0" Value="1" />
                        <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0" />
                    </DoubleAnimationUsingKeyFrames> 
                </Storyboard>
            </VisualState>
            <VisualState x:Name="PlayerControlsShown">
                <!-- Show controls storyboard -->
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)"
                     Storyboard.TargetName="PlayerControls">
                        <DiscreteObjectKeyFrame KeyTime="0:0:0.1">
                            <DiscreteObjectKeyFrame.Value>
                                <Visibility>
                                    Visible
                                </Visibility>
                            </DiscreteObjectKeyFrame.Value>
                        </DiscreteObjectKeyFrame>
                    </ObjectAnimationUsingKeyFrames>
                    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)"
                     Storyboard.TargetName="PlayerControls">
                        <EasingDoubleKeyFrame KeyTime="0" Value="0" />
                        <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="0" />
                        <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="1" />
                    </DoubleAnimationUsingKeyFrames> 
                </Storyboard>
            </VisualState>
        </VisualStateGroup>
        
    </VisualStateManager.VisualStateGroups>
        <i:Interaction.Behaviors>
        <interactions:DataStateBehavior Binding="{Binding ShowControls,Mode=TwoWay}" Value="true"
          TrueState="PlayerControlsShown" FalseState="PlayerControlsBoxHidden"/>

            <interactions:DataStateBehavior Binding="{Binding PlayButtonVisible}"
                                            Value="true" TrueState="PlayButtonOn"
                                            FalseState="PauseButtonOn" />

        </i:Interaction.Behaviors>
        
        <!--ContentPanel - 在此处放置其他内容-->
        <Grid x:Name="ContentPanel" Grid.Row="1"
              Margin="12,0,12,0">
        
        
            
            <Grid x:Name="Player" Grid.Row="0" Grid.Column="0" RenderTransformOrigin="0.5,0.5" 
                  Margin="0,1,0,0" Grid.RowSpan="2" VerticalAlignment="Center" HorizontalAlignment="Center">
                <MediaElement x:Name="mediaElement"   Source="{Binding SelectedVideoMediaUrl,Mode=TwoWay}" 
                    VerticalAlignment="Center" HorizontalAlignment="Center" AutoPlay="False" 
                    d:LayoutOverrides="Width" Cursor="Arrow" Volume="1">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="MediaOpened">
                            <SimpleMvvmToolkit:EventToCommand Command="{Binding MediaOpenedCommand}" CommandParameter="{Binding ElementName=mediaElement, Mode=OneWay}"/>
                        </i:EventTrigger>
                        <i:EventTrigger EventName="MouseLeftButtonDown">
                            <SimpleMvvmToolkit:EventToCommand Command="{Binding ShowPlayerControlsCommand}" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                    <!--<i:Interaction.Triggers>
                        <i:EventTrigger EventName="MediaOpened">
                            <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding MediaOpenedCommand}" 
                            CommandParameter="{Binding ElementName=mediaElement, Mode=OneWay}" />
                        </i:EventTrigger>
                        <i:EventTrigger EventName="MediaEnded">
                            <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding MediaEndedCommand}" />
                        </i:EventTrigger>
                        <i:EventTrigger EventName="MouseLeftButtonDown">
                            <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding ShowPlayerControlsCommand}" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>-->
                </MediaElement>
            </Grid>
            <Grid x:Name="PlayerControls" d:LayoutOverrides="GridBox" HorizontalAlignment="Stretch" 
                  VerticalAlignment="Bottom" Margin="0" RenderTransformOrigin="0.5,0.5" Height="117"
                  Background="#B2000000" Visibility="Collapsed">
                <Grid.RenderTransform>
                    <CompositeTransform />
                </Grid.RenderTransform>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="120" />
                    <ColumnDefinition Width="0.773*" />
                </Grid.ColumnDefinitions>
                <!--<i:Interaction.Triggers>
                    <i:EventTrigger EventName="MouseLeftButtonDown">
                        <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding ResetHideControlsCommand}" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>-->
                <Border x:Name="ProgressInfo" Grid.Column="1" BorderThickness="0" CornerRadius="0">
                    <Grid Margin="0,12,12,12">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="61" />
                            <RowDefinition Height="24" />
                        </Grid.RowDefinitions>
                        <TextBlock x:Name="ProgressDisplay" Text="{Binding CurrentProgress}" 
                                   Height="32" TextAlignment="Right" RenderTransformOrigin="0.5,0.5" Grid.Row="1"
                                   Margin="0" FontSize="15" FontFamily="Segoe WP Light" VerticalAlignment="Top" Foreground="White">
              <TextBlock.RenderTransform>
                <CompositeTransform />
              </TextBlock.RenderTransform>
                        </TextBlock>
                        <ProgressBar x:Name="progressBar" Grid.Row="0" Maximum="{Binding TotalDuration}" 
                                     Value="{Binding CurrentPosition}" Margin="0,32,0,5" Height="Auto" 
                                     Style="{StaticResource PhoneProgressBarStyle}"
                                     Foreground="{StaticResource PhoneAccentBrush}" />
                        <Rectangle Height="40" Fill="#00000000" VerticalAlignment="Bottom">
                           <i:Interaction.Triggers>
                                <i:EventTrigger EventName="MouseLeftButtonDown">
                                    <SimpleMvvmToolkit:EventToCommand Command="{Binding SeekCommand}" PassEventArgsToCommand="True" />
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                        </Rectangle>
                    </Grid>
                </Border>
                <Border x:Name="Controls" Grid.Column="0" BorderThickness="0" CornerRadius="0" Margin="0,0,0,0">
                    <StackPanel Orientation="Horizontal">
                        <Button Visibility="Visible" x:Name="PlayButton" 
                        Content="Play" Width="120" Height="80" Style="{StaticResource PhoneButtonStylePlay}" Margin="0,19,0,18">
                                
                           <i:Interaction.Triggers>
                                <i:EventTrigger EventName="Click">
                                    <SimpleMvvmToolkit:EventToCommand Command="{Binding PauseVideoCommand}" />
                                    <!-- <SimpleMvvmToolkit:EventToCommand Command="{Binding ResetHideControlsCommand}" />-->
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                        </Button>
                        <Button Visibility="Collapsed" x:Name="PauseButton" Content="Play"
                         Width="120" Height="80" Style="{StaticResource PhoneButtonStylePause}"
                          Margin="0,19,0,18">
                           <i:Interaction.Triggers>
                                <i:EventTrigger EventName="Click">
                                    <SimpleMvvmToolkit:EventToCommand Command="{Binding PauseVideoCommand}" />
                                   <!--  <SimpleMvvmToolkit:EventToCommand Command="{Binding ResetHideControlsCommand}" />-->
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                        </Button>
                    </StackPanel>
                </Border>
            </Grid>
        </Grid>
    </Grid>
</phone:PhoneApplicationPage>
VideoPlayerViewModel
using System;
using System.Windows;
using System.Threading;
using System.Collections.ObjectModel;

// Toolkit namespace
using SimpleMvvmToolkit;

// Toolkit extension methods
using SimpleMvvmToolkit.ModelExtensions;
using Think.MTV.Services;
using Think.Model;
using System.Windows.Input;
using System.Windows.Controls;
using System.IO;
using System.Windows.Threading;

namespace Think.MTV.ViewModels
{
    /// <summary>
    /// This class contains properties that a View can data bind to.
    /// <para>
    /// Use the <strong>mvvmprop</strong> snippet to add bindable properties to this ViewModel.
    /// </para>
    /// </summary>
    public class VideoPlayerViewModel : ViewModelBase<VideoPlayerViewModel>
    {
        #region Initialization and Cleanup

        // TODO: Add a member for IXxxServiceAgent
        private IVideoServiceAgent serviceAgent;

        // Default ctor
        public VideoPlayerViewModel() { }

        // TODO: ctor that accepts IXxxServiceAgent
        public VideoPlayerViewModel(IVideoServiceAgent serviceAgent)
        {
            this.serviceAgent = serviceAgent;
            if (videoMediaElement != null) Play(videoMediaElement);
            DispatcherTimer timer = new DispatcherTimer
            {
                Interval = new TimeSpan(0, 0, 5)
            };
            this.hideControlsTimer = timer;
            this.hideControlsTimer.Tick += new EventHandler(hideControlsTimer_Tick);
            DispatcherTimer timer2 = new DispatcherTimer
            {
                Interval = new TimeSpan(0, 0, 5)
            };

        }

        void hideControlsTimer_Tick(object sender, EventArgs e)
        {
            if (this.ShowControls)
            {
                this.ShowControls = false;
            }
        }

        #endregion


        #region Notifications

        // TODO: Add events to notify the view or obtain data from the view
        public event EventHandler<NotificationEventArgs<Exception>> ErrorNotice;

        #endregion

        #region Properties

        private DispatcherTimer hideControlsTimer;
        private DispatcherTimer hideExplicitTimer;
        private DispatcherTimer videoProgressTimer;
        private MediaElement videoMediaElement;
        private bool showControls;
        public bool ShowControls
        {
            get { return showControls; }
            set
            {
                showControls = value;

                if (value)
                {
                    this.hideControlsTimer.Start();
                }
                else
                {
                    this.hideControlsTimer.Stop();
                }

                this.NotifyPropertyChanged(p => p.ShowControls);
            }
        }

        private bool _PlayButtonVisible;
        public bool PlayButtonVisible
        {
            get
            {
                return _PlayButtonVisible;
            }

            set
            {
                _PlayButtonVisible = value;
                this.NotifyPropertyChanged(p => p.PlayButtonVisible);
            }
        }

        private string currentProgress;
        public string CurrentProgress
        {
            get
            {
                return this.currentProgress;
            }
            set
            {
                this.currentProgress = value;
                this.NotifyPropertyChanged(p => p.CurrentProgress);
            }
        }

        private double currentPosition;
        public double CurrentPosition
        {
            get
            {
                return this.currentPosition;
            }
            set
            {
                this.currentPosition = value;
                this.NotifyPropertyChanged(p => p.CurrentPosition);
            }
        }


        private double totalDuration;

        public double TotalDuration
        {
            get
            {
                return this.totalDuration;
            }
            set
            {
                this.totalDuration = value;
                this.NotifyPropertyChanged(p => p.TotalDuration);
            }
        }

        private Uri _SelectedVideoMediaUrl;

        public Uri SelectedVideoMediaUrl
        {
            get { return _SelectedVideoMediaUrl; }
            set
            {
                _SelectedVideoMediaUrl = value;
                this.NotifyPropertyChanged(p => p.SelectedVideoMediaUrl);
            }
        }

        private static Video myVideo;

        public static Video MyVideo
        {
            get { return myVideo; }
            set { myVideo = value; }
        }
        private VideoDetail _Video;

        public VideoDetail Video
        {
            get { return _Video; }
            set { _Video = value; }
        }

        // TODO: Add properties using the mvvmprop code snippet

        #endregion
        #region Command
        public ICommand LoadCommand
        {
            get
            {
                return new DelegateCommand(LoadData);
            }
        }

        public ICommand MediaOpenedCommand
        {
            get
            {
                return new DelegateCommand<MediaElement>(Play);
            }
        }
        public ICommand ShowPlayerControlsCommand
        {
            get { return new DelegateCommand(ShowPlayerControls); }
        }

        public ICommand SeekCommand
        {
            get
            {
                return new DelegateCommand<object>(OnSeekCommand);
            }
        }
        public ICommand PauseVideoCommand
        {
            get
            {
                return new DelegateCommand(PauseVideo);
            }
        }

        #endregion

        #region Methods

        public void PauseVideo()
        {
            if (this.videoMediaElement.CurrentState == System.Windows.Media.MediaElementState.Playing)
            {
                if (this.videoMediaElement.CanPause)
                {
                    this.videoMediaElement.Pause();
                    this.PlayButtonVisible = true;

                }
                else
                {
                    this.videoMediaElement.Stop();
                }
                if (this.videoProgressTimer.IsEnabled)
                {
                    this.videoProgressTimer.Stop();
                }
            }
            else
            {
                this.videoMediaElement.Play();
                this.videoProgressTimer.Start();
                this.PlayButtonVisible = false;

            }
        }


        private void OnSeekCommand(object obj)
        {
            if (obj is MouseButtonEventArgs)
            {
                FrameworkElement element = (FrameworkElement)(obj as MouseButtonEventArgs).OriginalSource;
                double percentComplete = (obj as MouseButtonEventArgs).GetPosition(element).X / element.ActualWidth;
                this.Seek(percentComplete);
            }
        }

        private void Seek(double percentComplete)
        {
            int seconds = (int)(this.videoMediaElement.NaturalDuration.TimeSpan.TotalSeconds * percentComplete);
            this.videoMediaElement.Position = new TimeSpan(0, 0, seconds);
            this.SetCurrentPosition();
        }








        private void ShowPlayerControls()
        {
            ShowControls = !ShowControls;
        }
        // TODO: Add methods that will be called by the view
        private void LoadData()
        {
            if (MyVideo != null && Video != MyVideo)
                serviceAgent.GetVideoData(MyVideo, (vd, error) =>
                {
                    Video = vd;
                    SelectedVideoMediaUrl = new Uri(Video.VideoSrc);

                });
        }


        private void Play(MediaElement me)
        {
            MediaElement element = me;
            this.videoMediaElement = element;

            me.Play();
            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = (TimeSpan.FromSeconds(1.0));
            this.videoProgressTimer = timer;
            videoProgressTimer.Tick += new EventHandler(videoProgressTimer_Tick);
            this.SetCurrentPosition();

            this.PlayVideo(null);


        }

        private void SetCurrentPosition()
        {
            if ((this.CurrentPosition > 0.0) && (this.CurrentPosition >= this.TotalDuration))
            {
                this.CurrentPosition = 0.0;
                this.StopVideo(null);
            }
            int arg = this.videoMediaElement.Position.Seconds;

            this.CurrentProgress = string.Format("{0}:{1} / {2}:{3}", new object[] 
            {
                Math.Floor(this.videoMediaElement.Position.TotalMinutes).ToString("00"), 
                this.videoMediaElement.Position.Seconds.ToString("00"),
                Math.Floor(this.videoMediaElement.NaturalDuration.TimeSpan.TotalMinutes).ToString("00"), 
                this.videoMediaElement.NaturalDuration.TimeSpan.Seconds.ToString("00") 
            });

            this.CurrentPosition = this.videoMediaElement.Position.TotalSeconds;
            this.TotalDuration = this.videoMediaElement.NaturalDuration.TimeSpan.TotalSeconds;


        }
        public void PlayVideo(object param)
        {
            this.videoMediaElement.Play();
            this.videoProgressTimer.Start();
            this.PlayButtonVisible = false;
        }


        public void StopVideo(object param)
        {
            this.videoMediaElement.Stop();
            this.videoProgressTimer.Stop();
            this.SetCurrentPosition();
        }

        void videoProgressTimer_Tick(object sender, EventArgs e)
        {
            this.SetCurrentPosition();

        }
        #endregion

        #region Completion Callbacks

        // TODO: Optionally add callback methods for async calls to the service agent

        #endregion

        #region Helpers

        // Helper method to notify View of an error
        private void NotifyError(string message, Exception error)
        {
            // Notify view of an error
            Notify(ErrorNotice, new NotificationEventArgs<Exception>(message, error));
        }

        #endregion

    }
}
VideoPlayerStyle.xaml
<ResourceDictionary 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" mc:Ignorable="d">
    <Style x:Key="PhoneProgressBarStyle" TargetType="ProgressBar">
        <Setter Property="Foreground" Value="{StaticResource PhoneAccentBrush}" />
        <Setter Property="Background" Value="{StaticResource PhoneBackgroundBrush}" />
        <Setter Property="BorderThickness" Value="0" />
        <Setter Property="Height" Value="4" />
        <Setter Property="Maximum" Value="100" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ProgressBar">
                    <Grid x:Name="Root">
                        <Grid.Resources>
                            <Style x:Key="PhoneProgressBarSliderStyle" TargetType="Slider">
                                <Setter Property="Maximum" Value="3000" />
                                <Setter Property="Minimum" Value="0" />
                                <Setter Property="Height" Value="8" />
                                <Setter Property="Value" Value="0" />
                                <Setter Property="IsTabStop" Value="False" />
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate TargetType="Slider">
                                            <Grid x:Name="Root">
                                                <Grid.Resources>
                                                    <ControlTemplate x:Key="SliderThumb" TargetType="Thumb">
                                                        <Ellipse Fill="{TemplateBinding Foreground}" Height="{TemplateBinding Width}" Width="{TemplateBinding Width}" />
                                                    </ControlTemplate>
                                                </Grid.Resources>
                                                <Grid x:Name="HorizontalTemplate" Background="{TemplateBinding Background}">
                                                    <Grid.ColumnDefinitions>
                                                        <ColumnDefinition Width="Auto" />
                                                        <ColumnDefinition Width="Auto" />
                                                        <ColumnDefinition Width="*" />
                                                    </Grid.ColumnDefinitions>
                                                    <RepeatButton x:Name="HorizontalTrackLargeChangeDecreaseRepeatButton" Grid.Column="2" Template="{x:Null}" />
                                                    <Thumb x:Name="HorizontalThumb" Grid.Column="1" Height="{TemplateBinding Height}" IsTabStop="False" Template="{StaticResource SliderThumb}" Width="{TemplateBinding Height}" />
                                                    <RepeatButton x:Name="HorizontalTrackLargeChangeIncreaseRepeatButton" Grid.Column="2" Template="{x:Null}" />
                                                </Grid>
                                            </Grid>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </Grid.Resources>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Determinate" />
                                <VisualState x:Name="Indeterminate">
                                    <Storyboard RepeatBehavior="Forever">
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="IndeterminateRoot">
                                            <DiscreteObjectKeyFrame KeyTime="0">
                                                <DiscreteObjectKeyFrame.Value>
                                                    <Visibility>
                                                        Visible
                                                    </Visibility>
                                                </DiscreteObjectKeyFrame.Value>
                                            </DiscreteObjectKeyFrame>
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="DeterminateRoot">
                                            <DiscreteObjectKeyFrame KeyTime="0">
                                                <DiscreteObjectKeyFrame.Value>
                                                    <Visibility>
                                                        Collapsed
                                                    </Visibility>
                                                </DiscreteObjectKeyFrame.Value>
                                            </DiscreteObjectKeyFrame>
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Storyboard.TargetName="ProgressBarTrack">
                                            <DiscreteObjectKeyFrame KeyTime="00:00:00" Value="0" />
                                        </ObjectAnimationUsingKeyFrames>
                                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00.0" Duration="00:00:02.9" Storyboard.TargetProperty="value" Storyboard.TargetName="slider1">
                                            <LinearDoubleKeyFrame KeyTime="00:00:00.4" Value="1000" />
                                            <LinearDoubleKeyFrame KeyTime="00:00:02.4" Value="2000" />
                                            <LinearDoubleKeyFrame KeyTime="00:00:02.8" Value="3000" />
                                        </DoubleAnimationUsingKeyFrames>
                                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00.2" Duration="00:00:02.9" Storyboard.TargetProperty="value" Storyboard.TargetName="slider2">
                                            <LinearDoubleKeyFrame KeyTime="00:00:00.4" Value="1000" />
                                            <LinearDoubleKeyFrame KeyTime="00:00:02.4" Value="2000" />
                                            <LinearDoubleKeyFrame KeyTime="00:00:02.8" Value="3000" />
                                        </DoubleAnimationUsingKeyFrames>
                                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00.4" Duration="00:00:02.9" Storyboard.TargetProperty="value" Storyboard.TargetName="slider3">
                                            <LinearDoubleKeyFrame KeyTime="00:00:00.4" Value="1000" />
                                            <LinearDoubleKeyFrame KeyTime="00:00:02.4" Value="2000" />
                                            <LinearDoubleKeyFrame KeyTime="00:00:02.8" Value="3000" />
                                        </DoubleAnimationUsingKeyFrames>
                                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00.6" Duration="00:00:02.9" Storyboard.TargetProperty="value" Storyboard.TargetName="slider4">
                                            <LinearDoubleKeyFrame KeyTime="00:00:00.4" Value="1000" />
                                            <LinearDoubleKeyFrame KeyTime="00:00:02.4" Value="2000" />
                                            <LinearDoubleKeyFrame KeyTime="00:00:02.8" Value="3000" />
                                        </DoubleAnimationUsingKeyFrames>
                                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00.8" Duration="00:00:02.9" Storyboard.TargetProperty="value" Storyboard.TargetName="slider5">
                                            <LinearDoubleKeyFrame KeyTime="00:00:00.4" Value="1000" />
                                            <LinearDoubleKeyFrame KeyTime="00:00:02.4" Value="2000" />
                                            <LinearDoubleKeyFrame KeyTime="00:00:02.8" Value="3000" />
                                        </DoubleAnimationUsingKeyFrames>
                                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00.0" Duration="00:00:02.9" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="slider1">
                                            <DiscreteDoubleKeyFrame KeyTime="00:00:02.8" Value="0" />
                                        </DoubleAnimationUsingKeyFrames>
                                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00.2" Duration="00:00:02.9" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="slider2">
                                            <DiscreteDoubleKeyFrame KeyTime="00:00:02.8" Value="0" />
                                        </DoubleAnimationUsingKeyFrames>
                                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00.4" Duration="00:00:02.9" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="slider3">
                                            <DiscreteDoubleKeyFrame KeyTime="00:00:02.8" Value="0" />
                                        </DoubleAnimationUsingKeyFrames>
                                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00.6" Duration="00:00:02.9" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="slider4">
                                            <DiscreteDoubleKeyFrame KeyTime="00:00:02.8" Value="0" />
                                        </DoubleAnimationUsingKeyFrames>
                                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00.8" Duration="00:00:02.9" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="slider5">
                                            <DiscreteDoubleKeyFrame KeyTime="00:00:02.8" Value="0" />
                                        </DoubleAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Border x:Name="ProgressBarTrack" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Opacity="0.3" Background="Black" />
                        <Grid x:Name="ProgressBarRootGrid">
                            <Grid x:Name="IndeterminateRoot" Visibility="Collapsed">
                                <Slider x:Name="slider1" Height="{TemplateBinding Height}" Style="{StaticResource PhoneProgressBarSliderStyle}" />
                                <Slider x:Name="slider2" Height="{TemplateBinding Height}" Style="{StaticResource PhoneProgressBarSliderStyle}" />
                                <Slider x:Name="slider3" Height="{TemplateBinding Height}" Style="{StaticResource PhoneProgressBarSliderStyle}" />
                                <Slider x:Name="slider4" Height="{TemplateBinding Height}" Style="{StaticResource PhoneProgressBarSliderStyle}" />
                                <Slider x:Name="slider5" Height="{TemplateBinding Height}" Style="{StaticResource PhoneProgressBarSliderStyle}" />
                            </Grid>
                            <Grid x:Name="DeterminateRoot" Visibility="Visible">
                                <Border x:Name="ProgressBarIndicator" HorizontalAlignment="Left" d:IsHidden="True" Background="#FFDC2100" BorderBrush="White" BorderThickness="0,0,0,0" />
                            </Grid>
                        </Grid>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style x:Key="PhoneButtonStylePause" TargetType="Button">
        <Setter Property="Background" Value="{StaticResource TransparentBrush}" />
        <Setter Property="BorderBrush" Value="{StaticResource PhoneAccentBrush}" />
        <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}" />
        <Setter Property="MinHeight" Value="72" />
        <Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilySemiBold}" />
        <Setter Property="FontSize" Value="{StaticResource PhoneFontSizeMediumLarge}" />
        <Setter Property="Padding" Value="10,0,10,5" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Grid Background="Transparent">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal" />
                                <VisualState x:Name="MouseOver" />
                                <VisualState x:Name="Pressed">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="Control.Foreground" Storyboard.TargetName="foregroundContainer">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="#FFDC2100" />
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="Border.Background" Storyboard.TargetName="ButtonBackground">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="#FFDC2100" />
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="Border.BorderBrush" Storyboard.TargetName="ButtonBackground">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="#FFDC2100" />
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="Shape.Fill" Storyboard.TargetName="PauseIcon">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="#FFFFFFFF" />
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Disabled">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="Control.Foreground" Storyboard.TargetName="foregroundContainer">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneDisabledBrush}" />
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="Control.BorderBrush" Storyboard.TargetName="ButtonBackground">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneDisabledBrush}" />
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="Control.Background" Storyboard.TargetName="ButtonBackground">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource TransparentBrush}" />
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="FocusStates">
                                <VisualState x:Name="Focused" />
                                <VisualState x:Name="Unfocused" />
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Border x:Name="ButtonBackground" BorderThickness="3" Background="#00FFFFFF" CornerRadius="50" Margin="23,3" BorderBrush="White">
                            <Grid>
                                <ContentControl x:Name="foregroundContainer" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" FontSize="{TemplateBinding FontSize}" FontFamily="{TemplateBinding FontFamily}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Padding="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Visibility="Collapsed" />
                                <Path x:Name="PauseIcon" Data="M71.999985,1.5020368E-05 L111.99998,1.5020368E-05 L111.99998,75.000008 L71.999985,75.000008 z M0,0 L40,0 L40,75 L0,75 z" Fill="#FFFFFFFF" Stretch="Fill" UseLayoutRounding="False" RenderTransformOrigin="0.5,0.5" Margin="0,10.556">
                                    <Path.RenderTransform>
                                        <CompositeTransform ScaleX="0.35" ScaleY="0.6" />
                                    </Path.RenderTransform>
                                </Path>
                            </Grid>
                        </Border>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style x:Key="PhoneButtonStylePlay" TargetType="Button">
        <Setter Property="Background" Value="{StaticResource TransparentBrush}" />
        <Setter Property="BorderBrush" Value="{StaticResource PhoneAccentBrush}" />
        <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}" />
        <Setter Property="MinHeight" Value="72" />
        <Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilySemiBold}" />
        <Setter Property="FontSize" Value="{StaticResource PhoneFontSizeMediumLarge}" />
        <Setter Property="Padding" Value="10,0,10,5" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Grid Background="Transparent">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal" />
                                <VisualState x:Name="MouseOver" />
                                <VisualState x:Name="Pressed">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="Control.Foreground" Storyboard.TargetName="foregroundContainer">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="#FFDC2100" />
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="Border.Background" Storyboard.TargetName="ButtonBackground">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="#FFDC2100" />
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="Border.BorderBrush" Storyboard.TargetName="ButtonBackground">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="#FFDC2100" />
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="Shape.Fill" Storyboard.TargetName="PlayIcon">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="#FFFFFFFF" />
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Disabled">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="Control.Foreground" Storyboard.TargetName="foregroundContainer">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneDisabledBrush}" />
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="Control.BorderBrush" Storyboard.TargetName="ButtonBackground">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneDisabledBrush}" />
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="Control.Background" Storyboard.TargetName="ButtonBackground">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource TransparentBrush}" />
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="FocusStates">
                                <VisualState x:Name="Focused" />
                                <VisualState x:Name="Unfocused" />
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Border x:Name="ButtonBackground" BorderThickness="3" Background="#00FFFFFF" CornerRadius="50" Margin="23,3" BorderBrush="White">
                            <Grid>
                                <ContentControl x:Name="foregroundContainer" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" FontSize="{TemplateBinding FontSize}" FontFamily="{TemplateBinding FontFamily}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Padding="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Visibility="Collapsed" />
                                <Path x:Name="PlayIcon" Stretch="Fill" Data="F1 M26.6633,15.998 C17.775534,21.330667 0,31.996 0,31.996 C0,31.996 0,1.52588E-05 0,1.52588E-05 C0,1.52588E-05 17.775534,10.665339 26.6633,15.998 z" UseLayoutRounding="False" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5" Height="59.154" Fill="White" Margin="5.25,0,-5.25,0">
                                    <Path.RenderTransform>
                                        <CompositeTransform ScaleX="0.4" ScaleY="0.65" TranslateX="-1.7881393432617188E-07" TranslateY="-2.384185791015625E-07" />
                                    </Path.RenderTransform>
                                </Path>
                            </Grid>
                        </Border>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style> 
</ResourceDictionary>

搞定

转载请注明文章出处:http://www.cnblogs.com/thinkaspx/

原文地址:https://www.cnblogs.com/thinkaspx/p/2633511.html