using Microsoft.Win32;
using System;
using System.Windows;
using System.Windows.Controls.Primitives;
using System.Windows.Threading;
namespace TestProject
{
/// <summary>
/// 메인 윈도우
/// </summary>
public partial class MainWindow : Window
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 재상 시간 슬라이더 드래그 여부
/// </summary>
private bool isPlayTimeSliderDragging = false;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainWindow()
/// <summary>
/// 생성자
/// </summary>
public MainWindow()
{
InitializeComponent();
this.mediaElement.MediaOpened += mediaElement_MediaOpened;
this.mediaElement.MediaEnded += mediaElement_MediaEnded;
this.mediaElement.MediaFailed += mediaElement_MediaFailed;
this.playTimeSlider.ValueChanged += playTimeSlider_ValueChanged;
this.playButton.Click += playButton_Click;
this.stopButton.Click += stopButton_Click;
this.pauseButton.Click += pauseButton_Click;
this.selectButton.Click += selectButton_Click;
this.playTimeSlider.AddHandler
(
Thumb.DragStartedEvent,
new DragStartedEventHandler(playTimeSlider_DragStarted)
);
this.playTimeSlider.AddHandler
(
Thumb.DragCompletedEvent,
new DragCompletedEventHandler(playTimeSlider_DragCompleted)
);
this.volumeSlider.AddHandler
(
Thumb.DragCompletedEvent,
new DragCompletedEventHandler(volumeSlider_DragCompleted)
);
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
#region 미디어 엘리먼트 미디어 오픈시 처리하기 - mediaElement_MediaOpened(sender, e)
/// <summary>
/// 미디어 엘리먼트 미디어 오픈시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void mediaElement_MediaOpened(object sender, RoutedEventArgs e)
{
this.playTimeSlider.Minimum = 0;
this.playTimeSlider.Maximum = this.mediaElement.NaturalDuration.TimeSpan.TotalSeconds;
}
#endregion
#region 미디어 엘리먼트 미디어 종료시 처리하기 - mediaElement_MediaEnded(sender, e)
/// <summary>
/// 미디어 엘리먼트 미디어 종료시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void mediaElement_MediaEnded(object sender, RoutedEventArgs e)
{
this.mediaElement.Stop();
}
#endregion
#region 미디어 엘리먼트 미디어 실패시 처리하기 - mediaElement_MediaFailed(sender, e)
/// <summary>
/// 미디어 엘리먼트 미디어 실패시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void mediaElement_MediaFailed(object sender, ExceptionRoutedEventArgs e)
{
MessageBox.Show("재생시 에러 발생 : " + e.ErrorException.Message.ToString());
}
#endregion
#region 재생 시간 슬라이더 드래그 시작시 처리하기 - playTimeSlider_DragStarted(sender, e)
/// <summary>
/// 재생 시간 슬라이더 드래그 시작시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void playTimeSlider_DragStarted(object sender, DragStartedEventArgs e)
{
this.isPlayTimeSliderDragging = true;
this.mediaElement.Pause();
}
#endregion
#region 재생 시간 슬라이더 드래그 완료시 처리하기 - playTimeSlider_DragCompleted(sender, e)
/// <summary>
/// 재생 시간 슬라이더 드래그 완료시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void playTimeSlider_DragCompleted(object sender, DragCompletedEventArgs e)
{
this.mediaElement.Position = TimeSpan.FromSeconds(this.playTimeSlider.Value);
this.mediaElement.Play();
this.isPlayTimeSliderDragging = false;
}
#endregion
#region 재생 시간 슬라이더 값 변경시 처리하기 - playTimeSlider_ValueChanged(sender, e)
/// <summary>
/// 재생 시간 슬라이더 값 변경시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void playTimeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if(this.mediaElement.Source == null)
{
return;
}
this.playTimeLabel.Content = string.Format
(
"{0} / {1}",
this.mediaElement.Position.ToString(@"mm\:ss"),
this.mediaElement.NaturalDuration.TimeSpan.ToString(@"mm\:ss")
);
}
#endregion
#region 재생 버튼 클릭시 처리하기 - playButton_Click(sender, e)
/// <summary>
/// 재생 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void playButton_Click(object sender, RoutedEventArgs e)
{
if(this.mediaElement.Source == null)
{
return;
}
this.mediaElement.Play();
}
#endregion
#region 중단 버튼 클릭시 처리하기 - stopButton_Click(sender, e)
/// <summary>
/// 중단 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void stopButton_Click(object sender, RoutedEventArgs e)
{
if(this.mediaElement.Source == null)
{
return;
}
this.mediaElement.Stop();
}
#endregion
#region 중지 버튼 클릭시 처리하기 - pauseButton_Click(sender, e)
/// <summary>
/// 중지 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void pauseButton_Click(object sender, RoutedEventArgs e)
{
if(this.mediaElement.Source == null)
{
return;
}
this.mediaElement.Pause();
}
#endregion
#region 볼륨 슬라이더 드래그 완료시 처리하기 - volumeSlider_DragCompleted(sender, e)
/// <summary>
/// 볼륨 슬라이더 드래그 완료시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void volumeSlider_DragCompleted(object sender, DragCompletedEventArgs e)
{
this.mediaElement.Volume = this.volumeSlider.Value;
}
#endregion
#region 파일 선택 버튼 클릭시 처리하기 - selectButton_Click(sender, e)
/// <summary>
/// 파일 선택 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void selectButton_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog()
{
Filter = "모든 파일 (*.*)|*.*",
DefaultExt = ".avi",
Multiselect = false
};
if(openFileDialog.ShowDialog() == true)
{
this.mediaElement.Source = new Uri(openFileDialog.FileName);
this.mediaElement.Volume = 0.5;
this.mediaElement.SpeedRatio = 1;
DispatcherTimer dispatcherTimer = new DispatcherTimer()
{
Interval = TimeSpan.FromSeconds(1)
};
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Start();
this.mediaElement.Play();
}
}
#endregion
#region 디스패처 타이머 틱 처리하기 - dispatcherTimer_Tick(sender, e)
/// <summary>
/// 디스패처 타이머 틱 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
if(this.isPlayTimeSliderDragging)
{
return;
}
if(this.mediaElement.Source == null || !this.mediaElement.NaturalDuration.HasTimeSpan)
{
this.playTimeLabel.Content = "선택된 파일이 없습니다...";
return;
}
this.playTimeSlider.Value = this.mediaElement.Position.TotalSeconds;
}
#endregion
}
}