前提
C# WPFで、ボタン等のクリック音を表現するため、以下のようにプログラムを作成しました。
ボタンクリック → MediaPlayerでmp3ファイルを再生 → MediaEndedイベントハンドラで処理を呼び出す。
発生している問題・エラーメッセージ
クリック音のようなごく短いファイルを再生した時、まれにMediaEndedイベントが発生しないケースがあります。
エラーメッセージ等は出ません。MediaElementを使用しても同様でした。
サンプルコードでは、ボタンクリック時にボタンのIsEnabledプロパティをfalseに設定しており(連打防止のため)、MediaEndedが発生しないとフリーズしたように見えます。
また、MediaEndedイベントハンドラ登録後に100msほどスリープさせると発生率が下がったような気がしますが、実際はわかりません。
該当のソースコード
MediaEndedTest1.xaml
XAML
1<Page x:Class="Test.MediaEndedTest.MediaEndedTest1" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:local="clr-namespace:Test.MediaEndedTest" 7 mc:Ignorable="d" 8 d:DesignHeight="450" d:DesignWidth="800" 9 Title="MediaEndedTest1"> 10 11 <Grid> 12 <Button x:Name="Button" Content="To Page2" 13 Height="50" Width="200" 14 Click="Button_Click"/> 15 </Grid> 16</Page>
MediaEndedTest1.xaml.cs
C#
1using System; 2using System.Windows; 3using System.Windows.Controls; 4using System.Windows.Media; 5using System.Windows.Navigation; 6 7namespace Test.MediaEndedTest 8{ 9 /// <summary> 10 /// MediaEndedTest1.xaml の相互作用ロジック 11 /// </summary> 12 public partial class MediaEndedTest1 : Page 13 { 14 public MediaEndedTest1() 15 { 16 InitializeComponent(); 17 } 18 19 private void Button_Click(object sender, RoutedEventArgs e) 20 { 21 var pushedButton = (Button)sender; 22 pushedButton.IsEnabled = false; 23 var pushSound = new MediaPlayer(); 24 pushSound.MediaEnded += (sender, e) => 25 { 26 var mediaEndedTest2 = new MediaEndedTest2(); 27 NavigationService.Navigate(mediaEndedTest2); 28 }; 29 pushSound.Open(new Uri(//クリック音のmp3ファイル//, UriKind.Relative)); 30 pushSound.Play(); 31 } 32 } 33}
MediaEndedTest2.xaml
XAML
1<Page x:Class="Test.MediaEndedTest.MediaEndedTest2" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:local="clr-namespace:Test.MediaEndedTest" 7 mc:Ignorable="d" 8 d:DesignHeight="450" d:DesignWidth="800" 9 Title="MediaEndedTest2"> 10 11 <Grid> 12 <Button x:Name="Button" Content="To Page1" 13 Height="50" Width="200" 14 Click="Button_Click"/> 15 </Grid> 16</Page>
mediaEndedTest2.xaml.cs
C#
1using System; 2using System.Collections.Generic; 3using System.Text; 4using System.Threading; 5using System.Windows; 6using System.Windows.Controls; 7using System.Windows.Data; 8using System.Windows.Documents; 9using System.Windows.Input; 10using System.Windows.Media; 11using System.Windows.Media.Imaging; 12using System.Windows.Navigation; 13using System.Windows.Shapes; 14 15namespace Test.MediaEndedTest 16{ 17 /// <summary> 18 /// MediaEndedTest2.xaml の相互作用ロジック 19 /// </summary> 20 public partial class MediaEndedTest2 : Page 21 { 22 public MediaEndedTest2() 23 { 24 InitializeComponent(); 25 } 26 27 private void Button_Click(object sender, RoutedEventArgs e) 28 { 29 var pushedButton = (Button)sender; 30 pushedButton.IsEnabled = false; 31 var pushSound = new MediaPlayer(); 32 pushSound.MediaEnded += (sender, e) => 33 { 34 var mediaEndedTest1 = new MediaEndedTest1(); 35 NavigationService.Navigate(mediaEndedTest1); 36 }; 37 pushSound.Open(new Uri( //クリック音のmp3ファイル//, UriKind.Relative)); 38 pushSound.Play(); 39 } 40 } 41} 42
補足情報(FW/ツールのバージョンなど)
Visual Studio 2022
C#10.0
WPF

回答1件
あなたの回答
tips
プレビュー