開発環境 |
Microsoft Visual Studio Express 2013 for Windows Desktop |
実行環境 |
Microsoft Windows 8.1 (64bit) |
プロジェクトの種類 |
Visual C#/WPF アプリケーション |
プロジェクト名 |
WpfMediaPlayer |
参考
MainWindow.xaml
<Window x:Class="WpfMediaPlayer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
AllowDrop="True" Drop="Window_Drop"
KeyDown="Window_KeyDown">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="10"/>
<RowDefinition Height="25"/>
</Grid.RowDefinitions>
<Border Background="Black"/>
<MediaElement Name="media" LoadedBehavior="Manual" UnloadedBehavior="Manual"
MediaOpened="media_MediaOpened"/>
<ProgressBar Name="progress" MouseUp="progress_MouseUp" Grid.Row="1"/>
<Label Name="label" Grid.Row="2"/>
</Grid>
</Window>
MainWindow.xaml.cs
using System;
using System.Windows;
using System.Windows.Input;
using System.Windows.Threading;
namespace WpfMediaPlayer
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
enum Status { Stop, Play, Pause }
private Status _status = Status.Stop;
private DispatcherTimer _timer;
private string _duration = "";
public MainWindow()
{
InitializeComponent();
_timer = new DispatcherTimer();
_timer.Interval = new TimeSpan(0, 0, 1);
_timer.Tick += _timer_Tick;
_timer.Start();
}
void _timer_Tick(object sender, EventArgs e)
{
TimeSpan ts = media.Position;
label.Content = String.Format("{0} {1} / {2}",
_status, ts.ToString(@"hh\:mm\:ss"), _duration);
progress.Value = ts.TotalMilliseconds;
}
private void Window_Drop(object sender, DragEventArgs e)
{
string[] files = e.Data.GetData(DataFormats.FileDrop) as string[];
media.Source = new Uri(files[0]);
media.Play();
_status = Status.Play;
}
private void Window_KeyDown(object sender, KeyEventArgs e)
{
switch (e.Key)
{
case Key.Escape:
media.Stop();
_status = Status.Stop;
break;
case Key.Space:
if (_status == Status.Play)
{
media.Pause();
_status = Status.Pause;
}
else
{
media.Play();
_status = Status.Play;
}
break;
case Key.Left:
media.Position -= new TimeSpan(0, 0, getSeconds());
break;
case Key.Right:
media.Position += new TimeSpan(0, 0, getSeconds());
break;
}
}
private int getSeconds()
{
ModifierKeys mod = Keyboard.Modifiers;
if ((mod & ModifierKeys.Control) != ModifierKeys.None) return 60;
if ((mod & ModifierKeys.Shift) != ModifierKeys.None) return 300;
return 10;
}
private void media_MediaOpened(object sender, RoutedEventArgs e)
{
Duration dur = media.NaturalDuration;
_duration = dur.ToString();
progress.Maximum = dur.TimeSpan.TotalMilliseconds;
}
private void progress_MouseUp(object sender, MouseButtonEventArgs e)
{
Point pt = e.GetPosition(progress);
progress.Value = progress.Maximum * pt.X / progress.ActualWidth;
media.Position = new TimeSpan(0, 0, 0, 0, (int)progress.Value);
}
}
}
最終更新:2014年07月26日 15:40