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>
Was it helpful?

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();
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top