How to play a sound in WPF
-
11-09-2019 - |
Question
I'm a novice C# programmer and am having trouble getting music to play in my WPF (Windows) application using VS 2008. This is a web app. What I think is happening is myMediaElementExample
variable is empty at the time it is used to execute the Play
method in the ExpenseReportPage.xaml.cs
file.
Right now this program builds, but after I run it, it encounters an exception at the myMediaElementExample.Play();
line. The exception says:
An unhandled win32 exception occurred in the WpfApplication1.vhost.exe [948].
Can any of you give me tips on what else I might try? I've only included the code relevant to this problem:
ExpenseReportPage.xaml.cs file:
namespace ExpenseIt
{
public partial class ExpenseReportPage : Page
{
... }
public partial class MediaElementExample : Page
{
MediaElement myMediaElementExample = new MediaElement();
public MediaElementExample()
{
}
public void OnMouseDownPlayMedia(object sender, RoutedEventArgs args) //MouseButtonEventArgs
{
// The Play method will begin the media if it is not currently active or
// resume media if it is paused. This has no effect if the media is
// already running.
myMediaElementExample.Play();
}
}
}
HomePage.xaml.cs file:
namespace ExpenseIt
{
public partial class HomePage : Page
{
MediaElementExample mediaElementExample = new MediaElementExample();
public HomePage()
{
InitializeComponent();
}
void HandleClick(object sender, RoutedEventArgs e)
{
Button srcButton = e.Source as Button;
srcButton.Width = 200;
mediaElementExample.OnMouseDownPlayMedia(sender, e);
}
}
}
Solution
For debugging purposes surround the line:
myMediaElementExample.Play();
with a try{} catch{}
block:
try
{
myMediaElementExample.Play();
}
catch (Exception ex)
{
// Either print out the exception or examine it in the debugger.
}
This will give you more information on what's causing the exception. If it's still unclear update the question with this new information.
If myMediaElementExample
was null then I'd expect that you'd get a System.NullReferenceException
rather than the win32 one you're seeing. You can check this by setting a break point on the myMediaElementExample.Play();
line and examining it.
Once you've found and fixed the problem you could remove the exception handler or if you want to be cautious leave it in, but only trap the exceptions that MediaElement.Play
raises.
OTHER TIPS
Thank you Chris and Norla. I did find the exception cause:
Cannot control media unless LoadedBehavior or UnloadedBehavior is set to Manual.
However I found a really easy workaround! I googled the solution:
<MediaElement Source="The Boogie Monster.mp3" />
in the xaml file.
The solution to your original question is to add LoadedBehavior="Manual" to your MediaElement in your XAML. E.g.:
<MediaElement Source="Samples/robot.wmv" LoadedBehavior="Manual" />