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>
According to the MSDN you should set
AutoPlaytofalsebefore setting theSourceproperty.As you are setting the
SourceinSetPlayerSourceyou could remove the setter from the XAML. Apart from that the code looks good.However, I’ve just realised that you are calling
Playstraight after the call toSetPlayerSource. This won’t have given your code time to actually load the media before trying to play it.You need to call
Playon theMediaOpenedevent.