MediaElement AutoPlay = “False” bug
-
27-10-2019 - |
Question
I'm parsing multiple audio file uri's from XML and binding them to MediaElement's Source property. I have eight buttons which trigger the audio files. When the AutoPlay property is set to True, everything works great. Each button triggers the right audio file. BUT since I don't want the audio to start playing as soon as the page loads I've set the AutoPlay to False. Now nothing works. The page loads but the buttons don't trigger the audio files. How can I solve this bug?
Code:
public partial class MainPage : PhoneApplicationPage
{
string name = "C";
public MainPage()
{
InitializeComponent();
}
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
SetPlayerSource();
base.OnNavigatedTo(e);
}
private void SetPlayerSource()
{
XDocument audioPlayer = XDocument.Load("Audio.xml");
var aani = (from audio in audioPlayer.Descendants("Note")
where audio.Attribute("id").Value == name
select new AudioClass
{
Audio = (string)audio.Element("url").Value
}).SingleOrDefault();
player.Source = new Uri(aani.Audio, UriKind.RelativeOrAbsolute);
}
private void C_Key_Click(object sender, RoutedEventArgs e)
{
var buttonName = (sender as Button).Name;
var underscorePos = buttonName.IndexOf('_');
name = buttonName.Substring(0, underscorePos);
SetPlayerSource();
player.Play();
}
private void D_Key_Click(object sender, RoutedEventArgs e)
{
var buttonName = (sender as Button).Name;
var underscorePos = buttonName.IndexOf('_');
name = buttonName.Substring(0, underscorePos);
SetPlayerSource();
player.Play();
}
XAML:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="41,-8,-17,8">
<Button x:Name="C_key" Content="" HorizontalAlignment="Left" Height="220" Margin="8,0,0,8" Style="{StaticResource C}" VerticalAlignment="Bottom" Width="75" Click="C_Key_Click"/>
<Button x:Name="D_key" Content="" HorizontalAlignment="Left" Height="220" Margin="87,0,0,8" Style="{StaticResource D}" VerticalAlignment="Bottom" Width="75" Click="D_Key_Click"/>
<Button x:Name="E_key" Content="" HorizontalAlignment="Left" Height="220" Margin="166,0,0,8" Style="{StaticResource E}" VerticalAlignment="Bottom" Width="75" Click="E_Key_Click"/>
<Button x:Name="F_key" Content="" HorizontalAlignment="Left" Height="220" Margin="245,0,0,8" Style="{StaticResource F}" VerticalAlignment="Bottom" Width="75" d:LayoutOverrides="Width" Click="F_Key_Click"/>
<Button x:Name="G_key" Content="" Height="220" Margin="324,0,305,8" Style="{StaticResource G}" VerticalAlignment="Bottom" Click="G_Key_Click"/>
<Button x:Name="A_key" Content="" HorizontalAlignment="Right" Height="220" Margin="0,0,226,8" Style="{StaticResource A}" VerticalAlignment="Bottom" Width="75" Click="A_Key_Click"/>
<Button x:Name="B_key" Content="" HorizontalAlignment="Right" Height="220" Margin="0,0,147,8" Style="{StaticResource B}" VerticalAlignment="Bottom" Width="75" Click="B_Key_Click"/>
<Button x:Name="C2_key" Content="" HorizontalAlignment="Right" Height="220" Margin="0,0,68,8" Style="{StaticResource C2}" VerticalAlignment="Bottom" Width="75" Click="C2_Key_Click"/>
<MediaElement Height="120" HorizontalAlignment="Left" Margin="8,6,0,0" Name="player" VerticalAlignment="Top" Width="160" Source="{Binding Audio}" Volume="1" AutoPlay="False"/>
</Grid>
Solution
According to the MSDN you should set AutoPlay
to false
before setting the Source
property.
As you are setting the Source
in SetPlayerSource
you could remove the setter from the XAML. Apart from that the code looks good.
However, I've just realised that you are calling Play
straight after the call to SetPlayerSource
. This won't have given your code time to actually load the media before trying to play it.
You need to call Play
on the MediaOpened
event.
OTHER TIPS
First, replace Name=player
in the MediaElement
with x:Name=player
. That has sometimes caused issues with other controls.
If that doesn't work, you may be trying to call the Play
method before the audio has finished loading. Instead, try handling the MediaOpened
event and playing the file there.
private void player_MediaOpened(object sender, RoutedEventArgs e)
{
player.Play();
}