MediaElementを使用する WPF
MediaElementを使用する WPF
音楽再生を行うには、MediaElementを使用する。
しかし、WPFでプレイヤーを作った所で、使わない使えない代物しかできないのでは?
という意見はおいて置き、とにかくそれらしいものをさくっと作ってみた。
プログレスバーに、現在の再生位置を
スライダーでボリュームを
ボタンで、再生、停止、一時停止を
実装したもの。
他に、再生速度変更もできるらしい。
他に、追加すればと思うものはたくさんあるが、追加して作った所で日常的には使わないだろうと思う。
結局、MediaElementは、アプリで付録的に音を鳴らす程度に使用するものだと思う。
であれば、必要十分だ。
ちなみに、タイマーのサンプルはMSのサイトに載っていたものをコピペで使っています。
メニューを追加してみる。
基本的に、<Menu>タグの中に、MenuItemを追加していけばよいらしく、階層化も、MenuItemを入れ子にすれば簡単に実現可能。
<Window x:Class="WindowMediaElement"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WindowMediaElement" Height="300" Width="300">
<Grid>
<MediaElement Source="C:\Users\admin\Music\テイラー・スウィフト\フィアレス\01 フィアレス.wma"
Volume="{Binding ElementName=Slider1, Path=Value}" Name="Media" UnloadedBehavior="Manual" LoadedBehavior="Manual" />
<Slider Height="34" HorizontalAlignment="Left" Margin="28,164,0,0" Name="Slider1" VerticalAlignment="Top"
Width="218" Maximum="1" LargeChange="0.1" IsMoveToPointEnabled="True" TickFrequency="0.1" TickPlacement="TopLeft" Value="0.5" />
<Button Height="27" HorizontalAlignment="Left" Margin="28,212,0,0" Name="Button1" VerticalAlignment="Top"
Width="57" FontFamily="Wingdings 3" Content="u" />
<Button Content="■" Height="{Binding ElementName=Button1, Path=Height}" HorizontalAlignment="Left" Margin="101,212,0,0"
Name="Button2" VerticalAlignment="Top" Width="{Binding ElementName=Button1,Path=Width}" />
<Button Content="一時停止" Height="29" HorizontalAlignment="Left" Margin="180,212,0,0" Name="Button3" VerticalAlignment="Top" Width="53" />
<ProgressBar Height="27" HorizontalAlignment="Left" Margin="12,114,0,0" Name="ProgressBar1" VerticalAlignment="Top"
Width="254" Value="{Binding ElementName=Media,Path=Position.Second}"/>
<Label Content="{Binding ElementName=Media,Path=Position.Second}" Height="32" HorizontalAlignment="Left" Margin="32,46,0,0"
Name="Label1" VerticalAlignment="Top" Width="175" />
<Menu Height="23" HorizontalAlignment="Left" Name="Menu1" VerticalAlignment="Top" Width="278" >
<MenuItem Header="メニュー">
<MenuItem Header="音声">
<MenuItem Header="再生" Name="play" Click="Button1_Click"/>
<MenuItem Header="停止" Name="stop" Click="Button2_Click"/>
<MenuItem Header="一時停止" Name="Pause" Click="Button3_Click"/>
</MenuItem>
<MenuItem Header="終了" Name="end" />
</MenuItem>
</Menu>
</Grid>
</Window>
Imports System.Windows.Threading
Public Class WindowMediaElement
Dim dispatcherTimer As New DispatcherTimer()
Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
Me.Media.Play()
End Sub
Private Sub Button2_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button2.Click
Me.Media.Stop()
End Sub
Private Sub Button3_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button3.Click
Me.Media.Pause()
End Sub
Private Sub Media_MediaOpened(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Media.MediaOpened
Debug.Print(Me.Media.NaturalDuration.ToString)
Me.ProgressBar1.Maximum = Me.Media.NaturalDuration.TimeSpan.Hours * 360 + Me.Media.NaturalDuration.TimeSpan.Minutes * 60 + Me.Media.NaturalDuration.TimeSpan.Seconds
Debug.Print(Me.ProgressBar1.Maximum)
End Sub
Public Sub dispatcherTimer_Tick(ByVal sender As Object, ByVal e As EventArgs)
Me.Label1.Content = DateTime.Now.ToLongTimeString()
Debug.Print(Me.Media.Position.Hours * 360 + Me.Media.Position.Minutes * 60 + Me.Media.Position.Seconds)
Me.ProgressBar1.Value = Me.Media.Position.Hours * 360 + Me.Media.Position.Minutes * 60 + Me.Media.Position.Seconds
End Sub
Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
'From MS http://code.msdn.microsoft.com/windowsdesktop/XAMLCVB-WPF-Windows-WPF-85130460
dispatcherTimer = New DispatcherTimer(DispatcherPriority.Normal)
dispatcherTimer.Interval = New TimeSpan(0, 0, 1)
AddHandler dispatcherTimer.Tick, AddressOf dispatcherTimer_Tick
dispatcherTimer.Start()
End Sub
Private Sub end_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles [end].Click
'メニューの終了イベント
Me.Close()
End Sub
End Class
|
|