VideoController.cs
上传用户:huazai0421
上传日期:2008-05-30
资源大小:405k
文件大小:9k
源码类别:

SilverLight

开发平台:

C#

  1. using System;
  2. using System.Windows;
  3. using System.Windows.Controls;
  4. using System.Windows.Input;
  5. using System.Windows.Media;
  6. using System.Windows.Threading;
  7. namespace ESRI.ArcGIS.Samples
  8. {
  9. public class VideoController : Control
  10. {
  11.         DispatcherTimer timer = new DispatcherTimer();
  12. Button PlayButton;
  13. Button PauseButton;
  14. Button StopButton;
  15. Slider ProgressBar;
  16. TextBlock CurrentTime;
  17. TextBlock Status;
  18. TextBlock TotalTime;
  19. FrameworkElement DownloadProgress;
  20. FrameworkElement Position;
  21. public VideoController()
  22. {
  23. DefaultStyleKey = typeof(VideoController);
  24.             timer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(250) };
  25.             timer.Tick += (s,e) => { UpdatePlayBackProgress(); };
  26. }
  27. public override void OnApplyTemplate()
  28. {
  29. PlayButton = GetTemplateChild("PlayButton") as Button;
  30. PauseButton = GetTemplateChild("PauseButton") as Button;
  31. StopButton = GetTemplateChild("StopButton") as Button;
  32. if (PlayButton != null)
  33. PlayButton.Click += new RoutedEventHandler(PlayButton_Click);
  34. if (PauseButton != null)
  35. PauseButton.Click += new RoutedEventHandler(PauseButton_Click);
  36. if (StopButton != null)
  37. StopButton.Click += new RoutedEventHandler(StopButton_Click);
  38. ProgressBar = GetTemplateChild("ProgressBar") as Slider;
  39. CurrentTime = GetTemplateChild("CurrentTime") as TextBlock;
  40. Status = GetTemplateChild("Status") as TextBlock;
  41. TotalTime = GetTemplateChild("TotalTime") as TextBlock;
  42. DownloadProgress = GetTemplateChild("DownloadProgress") as FrameworkElement;
  43. if(DownloadProgress != null)
  44. DownloadProgress.MouseLeftButtonDown += DownloadProgress_MouseLeftButtonDown;
  45. Position = GetTemplateChild("Position") as FrameworkElement;
  46. SetTotalTime();
  47.             SetCurrentState();
  48. SetDownloadProgress();
  49. base.OnApplyTemplate();
  50. }
  51. private void DownloadProgress_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  52. {
  53. FrameworkElement parent = DownloadProgress.Parent as FrameworkElement;
  54. Point p = e.GetPosition(parent);
  55. double pos = p.X / parent.ActualWidth;
  56. if (Media != null)
  57. {
  58. Media.Position = TimeSpan.FromMilliseconds(Media.NaturalDuration.TimeSpan.TotalMilliseconds * pos);
  59. UpdatePlayBackProgress();
  60. }
  61. }
  62. private void PlayButton_Click(object sender, RoutedEventArgs e)
  63. {
  64. if (Media != null)
  65. {
  66. Media.Play();
  67. }
  68.             timer.Start();
  69. }
  70. private void PauseButton_Click(object sender, RoutedEventArgs e)
  71. {
  72. if (Media != null)
  73. {
  74. Media.Pause();
  75. }
  76.             timer.Stop();
  77. }
  78. private void StopButton_Click(object sender, RoutedEventArgs e)
  79. {
  80. if (Media != null)
  81. {
  82. Media.Stop();
  83. }
  84.             timer.Stop();
  85.             UpdatePlayBackProgress();
  86. }
  87.         private void UpdatePlayBackProgress()
  88.         {
  89. if (Media != null)
  90. {
  91. if (CurrentTime != null)
  92. {
  93. CurrentTime.Text = FormatTimeSpan(Media.Position);
  94. }
  95. if (Position != null)
  96. {
  97. double pos = Media.Position.TotalMilliseconds / Media.NaturalDuration.TimeSpan.TotalMilliseconds;
  98. FrameworkElement parent = Position.Parent as FrameworkElement;
  99. pos = parent.ActualWidth * pos;
  100. Position.Margin = new Thickness(pos - Position.ActualWidth*.5, 
  101. Position.Margin.Top, Position.Margin.Right, Position.Margin.Bottom);
  102. }
  103. }
  104.         }
  105. /// <summary>
  106. /// Identifies the <see cref="Media"/> dependency property.
  107. /// </summary>
  108. public static readonly DependencyProperty MediaProperty =
  109. DependencyProperty.Register("Media", typeof(MediaElement), typeof(VideoController),
  110. new PropertyMetadata(null, OnMediaPropertyChanged));
  111. /// <summary>
  112. /// Gets or sets Media.
  113. /// </summary>
  114. public MediaElement Media
  115. {
  116. get { return (MediaElement)GetValue(MediaProperty); }
  117. set { SetValue(MediaProperty, value); }
  118. }
  119. /// <summary>
  120. /// MediaProperty property changed handler. 
  121. /// </summary>
  122. /// <param name="d">VideoController that changed its Media.</param>
  123. /// <param name="e">DependencyPropertyChangedEventArgs.</param> 
  124. private static void OnMediaPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  125. {
  126. VideoController dp = d as VideoController;
  127. MediaElement newElement = (MediaElement)e.NewValue;
  128. MediaElement oldElement = (MediaElement)e.OldValue;
  129. if (oldElement != null)
  130. {
  131. oldElement.BufferingProgressChanged -= dp.MediaBufferingProgressChanged;
  132. oldElement.CurrentStateChanged -= dp.MediaCurrentStateChanged;
  133. oldElement.MediaEnded -= dp.MediaEnded;
  134. oldElement.MediaFailed -= dp.MediaFailed;
  135. oldElement.MediaOpened -= dp.MediaOpened;
  136.                 newElement.DownloadProgressChanged -= dp.MediaDownloadProgressChanged;
  137. if (newElement != null)
  138. {
  139. newElement.BufferingProgressChanged += dp.MediaBufferingProgressChanged;
  140. newElement.CurrentStateChanged += dp.MediaCurrentStateChanged;
  141. newElement.MediaEnded += dp.MediaEnded;
  142. newElement.MediaFailed += dp.MediaFailed;
  143. newElement.MediaOpened += dp.MediaOpened;
  144.                 newElement.DownloadProgressChanged += dp.MediaDownloadProgressChanged;
  145. }
  146. }
  147.         private void MediaDownloadProgressChanged(object sender, RoutedEventArgs e)
  148.         {
  149. SetDownloadProgress();
  150.         }
  151. private void SetDownloadProgress()
  152. {
  153. if (DownloadProgress != null && Media != null)
  154. {
  155. DownloadProgress.RenderTransform = new ScaleTransform()
  156. {
  157. CenterX = 0,
  158. ScaleX = Media.DownloadProgress
  159. };
  160. //DownloadProgress.Width =
  161. //    (DownloadProgress.Parent as FrameworkElement).ActualWidth * Media.DownloadProgress;
  162. }
  163. }
  164. private void MediaOpened(object sender, RoutedEventArgs e)
  165. {
  166. if (Status != null)
  167. Status.Text = "";
  168. SetTotalTime();
  169. }
  170. private void SetTotalTime()
  171. {
  172. if (TotalTime != null && Media != null)
  173.                 TotalTime.Text = FormatTimeSpan(Media.NaturalDuration.TimeSpan);
  174. }
  175.         private string FormatTimeSpan(TimeSpan t)
  176.         {
  177.             if (Media.NaturalDuration.TimeSpan.Hours > 0)
  178.                return String.Format("{0}:{1:00}:{2:00}",
  179.                        t.Hours,
  180.                         t.Minutes,
  181.                        t.Seconds);
  182.             else
  183.                 return String.Format("{0}:{1:00}",
  184.                        t.Minutes,
  185.                        t.Seconds);
  186.         }
  187. private void MediaFailed(object sender, ExceptionRoutedEventArgs e)
  188. {
  189. }
  190. private void MediaEnded(object sender, RoutedEventArgs e)
  191. {
  192. Media.Stop();
  193.             SetCurrentState();
  194. }
  195. private void MediaCurrentStateChanged(object sender, RoutedEventArgs e)
  196. {
  197.             SetCurrentState();
  198. }
  199.         private void SetCurrentState()
  200.         {
  201.             if (Status != null && Media != null)
  202.             {
  203.                 switch (Media.CurrentState)
  204.                 {
  205.                     case MediaElementState.AcquiringLicense:
  206.                         Status.Text = "Acquiring License"; break;
  207.                     case MediaElementState.Buffering:
  208.                         Status.Text = "Buffering..."; break;
  209.                     case MediaElementState.Opening:
  210.                         Status.Text = "Opening..."; break;
  211.                     case MediaElementState.Paused:
  212.                         if (PlayButton != null) PlayButton.IsEnabled = true;
  213.                         if (PauseButton != null) PauseButton.IsEnabled = false;
  214.                         if (StopButton != null) StopButton.IsEnabled = true;
  215.                         Status.Text = "Paused"; break;
  216.                     case MediaElementState.Playing:
  217.                         if (PlayButton != null) PlayButton.IsEnabled = false;
  218.                         if (PauseButton != null) PauseButton.IsEnabled = true;
  219.                         if (StopButton != null) StopButton.IsEnabled = true;
  220.                         Status.Text = "Playing"; break;
  221.                     case MediaElementState.Stopped:
  222.                         if (PlayButton != null) PlayButton.IsEnabled = true;
  223.                         if (PauseButton != null) PauseButton.IsEnabled = false;
  224.                         if (StopButton != null) StopButton.IsEnabled = false;
  225.                         Status.Text = "Stopped"; break;
  226.                     case MediaElementState.Closed:
  227.                         Status.Text = "Closed"; break;
  228.                     default:
  229.                         Status.Text = ""; break;
  230.                 }
  231.             }
  232.         }
  233. private void MediaBufferingProgressChanged(object sender, RoutedEventArgs e)
  234. {
  235. }
  236. }
  237. }