MediaElementを使用する WPF

VB Tips And Sample(HOME)VBプログラマの為のWPF入門

MediaElementを使用する WPF

音楽再生を行うには、MediaElementを使用する。
しかし、WPFでプレイヤーを作った所で、使わない使えない代物しかできないのでは?
という意見はおいて置き、とにかくそれらしいものをさくっと作ってみた。
mediaelement
プログレスバーに、現在の再生位置を
スライダーでボリュームを
ボタンで、再生、停止、一時停止を
実装したもの。
他に、再生速度変更もできるらしい。
他に、追加すればと思うものはたくさんあるが、追加して作った所で日常的には使わないだろうと思う。
結局、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



VB Tips And Sample(HOME)VBプログラマの為のWPF入門