MediaElement AutoPlay = "Ложная" ошибка - PullRequest
3 голосов
/ 12 января 2012

Я анализирую несколько URI аудиофайлов из XML и связываю их со свойством Source MediaElement. У меня есть восемь кнопок, которые запускают аудио файлы. Когда для свойства AutoPlay установлено значение True, все работает отлично. Каждая кнопка запускает нужный аудиофайл. НО, поскольку я не хочу, чтобы звук начинал воспроизводиться сразу после загрузки страницы, я установил для AutoPlay значение False. Теперь ничего не работает. Страница загружается, но кнопки не запускают аудио файлы. Как я могу решить эту ошибку?

Код:

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>

Ответы [ 2 ]

6 голосов
/ 12 января 2012

В соответствии с MSDN вы должны установить AutoPlay на false до , установив свойство Source.

При настройке Source в SetPlayerSource вы можете удалить сеттер из XAML.Кроме того, код выглядит хорошо.

Однако я только что понял, что вы звоните Play сразу после вызова SetPlayerSource.Это не даст вашему коду время для фактической загрузки носителя перед его воспроизведением.

Вам нужно позвонить Play в случае MediaOpened.

3 голосов
/ 12 января 2012

Сначала замените Name=player в MediaElement на x:Name=player. Это иногда вызывало проблемы с другими элементами управления.

Если это не сработает, возможно, вы пытаетесь вызвать метод Play до окончания загрузки звука. Вместо этого попробуйте обработать событие MediaOpened и воспроизвести файл там.

private void player_MediaOpened(object sender, RoutedEventArgs e)
{
     player.Play();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...