WindowsPhone МедиаЭлемент

В моем приложении у меня есть один MediaElement на страницу. При переходе на эту страницу воспроизводится голосовое сообщение.

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
      base.OnNavigatedTo(e);
      mediaElement.Stop();
      smediaElement.Source = new Uri("res/sounds/" + soundName, UriKind.RelativeOrAbsolute);
}

Я зарегистрировал lsitener MediaOpened для MediaElement:

private void me_MediaOpened(object sender, RoutedEventArgs e)
{
        MediaElement m = (MediaElement)sender;
        m.Play();
}

Но звук воспроизводится только на каждой второй странице.
Так это выглядит так: Страница1 (звук) -> Страница2 (без звука) -> Страница3 (звук) -> Страница4 (без звука).
Я перепробовал все, и я не могу понять, что может вызвать такое поведение. Возможно, это не важно, но я просматриваю экземпляры одного и того же подкласса PhoneApplicationPage.
Есть идеи?
П


person Piotr Karasiński    schedule 14.03.2012    source источник
comment
Вы пытались обработать событие MediaFailed, чтобы увидеть, есть ли исключение? Вызывается ли открытое событие на страницах, где звук не воспроизводится?   -  person Matt Lacey    schedule 14.03.2012
comment
Хорошая точка зрения. Я попробую Media Failed. Открытое событие не вызывается на страницах, где не воспроизводится звук.   -  person Piotr Karasiński    schedule 15.03.2012
comment
один и тот же звук воспроизводится на каждой странице? Этот звук заканчивается перед переходом на следующую страницу? Вы останавливаете текущий звук воспроизведения при переходе со страницы?   -  person Matt Lacey    schedule 15.03.2012
comment
это не тот звук. Я останавливаю предыдущий звук в методе navigationFrom.   -  person Piotr Karasiński    schedule 15.03.2012
comment
Я проверил и зарегистрировал слушателя на MediaFailed. Это событие запускается, и появляется сообщение об ошибке 3123. Произошла ошибка.   -  person Piotr Karasiński    schedule 15.03.2012
comment
есть ли у ошибки стек вызовов, который может быть более полезным? Всегда ли альтернативные вызовы терпят неудачу? даже если поменять треки, которые воспроизводятся на каждой странице?   -  person Matt Lacey    schedule 15.03.2012
comment
ошибка не имеет стека вызовов. Я уже пробовал менять трек. Он всегда есть на каждой второй странице. Звук воспроизводится (неважно, какой файл я выберу) на страницах 1, 3, 5, .. и не воспроизводится на страницах 2, 4, 6, .. Я попытался снова открыть медиа-элемент в функции OnMediaFailed. Это работает в какой-то момент. Звук воспроизводился на каждой странице, если только я не нажал кнопку «Назад». Поэтому звук вообще не воспроизводился.   -  person Piotr Karasiński    schedule 15.03.2012
comment
О, я забыл упомянуть, что я даже пытался удалить MediaElement со страницы в onNavigatedFrom, поэтому не должно быть двух медиа-элементов, существующих одновременно. Это не работает.   -  person Piotr Karasiński    schedule 15.03.2012


Ответы (1)


Я решил эту проблему с динамическим созданием MediaElement и удалением из макета в onNavigatedFrom, вот код:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
        base.OnNavigatedTo(e);
        mediaElement = new MediaElement();
        slideSound.Volume = 1;
        LayoutRoot.Children.Add(mediaElement);
        ....
}

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
        base.OnNavigatedFrom(e);
        mediaElement.Stop();
        LayoutRoot.Children.Remove(mediaElement);
        mediaElement = null;
}

Это работает отлично. Довольно странно, что вам нужно удалить mediaElement со страницы, иначе на следующей странице воспроизведение звука будет работать неправильно.

person Piotr Karasiński    schedule 15.03.2012
comment
В качестве альтернативы вы можете создать один MediaElement на уровне приложения, и каждая страница будет обновлять то, что там воспроизводится, а не создавать новый экземпляр на каждой странице. - person Matt Lacey; 16.03.2012