Вопрос по windows-runtime, mediaelement, windows-store-apps, winrt-xaml – Global MediaElement, который продолжает играть после перехода на другую страницу

4

Я использую MediaElement для воспроизведения музыки в своем приложении метро. Я хочу, чтобы музыка продолжала играть, даже если я перейду на другую страницу.

В следующей теме также задавался этот вопрос: http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/241ba3b4-3e2a-4f9b-a704-87c7b1be7988/

Я сделал то, что предложил JimMan 1) В App.xaml.cs изменен шаблон элемента управления корневого фрейма, чтобы включить MediaElement

var rootFrame = new Frame();
rootFrame.Style = Resources["RootFrameStyle"] as Style;
rootFrame.Navigate(typeof(HomePage), MainViewModel.Instance);
Window.Current.Content = rootFrame;
Window.Current.Activate();

2) В Styles.xaml добавить

<Style  x:Key="RootFrameStyle" TargetType="Frame">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Frame">
                <Grid>
                    <MediaElement x:Name="MediaPlayer" AudioCategory="BackgroundCapableMedia" AutoPlay="True"  />
                    <ContentPresenter />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>   
</Style>

3) Для доступа к MediaElement на странице, к которой осуществляется переход:

DendencyObject rootGrid = VisualTreeHelper.GetChild(Window.Current.Content, 0);     
MediaElement rootMediaElement = (MediaElement)VisualTreeHelper.GetChild(rootGrid, 0);

Но VisualTreeHelper.GetChild (Window.Current.Content, 0); всегда возвращает ноль, даже если я пытаюсь получить доступ к MediaElemt на корневой странице.

Я построил небольшой пример проекта для демонстрации.

Пример проекта

Есть идеи ? Заранее спасибо !

С наилучшими пожеланиями Fabian

Ваш Ответ

1   ответ
2

ваш обработчик Navigated, в котором вы пытаетесь вызвать дочернее визуальное дерево, вызывается до того, как визуальное дерево полностью загружено (добавлено в визуальное дерево). Вы можете попробовать переместить свой код в обработчик событий Loaded.

РЕДАКТИРОВАТЬ*

Я подтвердил свою теорию, внеся следующие изменения:

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        this.Loaded += OnLoaded;
    }

    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        DependencyObject rootGrid = VisualTreeHelper.GetChild(Window.Current.Content, 0);
        MediaElement rootMediaElement = (MediaElement)VisualTreeHelper.GetChild(rootGrid, 0);
    }
}
Это работало хорошо для меня. (обратите внимание, я использую Release Preview, хотя это не должно иметь большого значения)
Нет, результат не тот же, для меня это выглядит так, как будто MediaElement неправильно помещен в корневой фрейм. elDietze
Большое спасибо ! Это работает сейчас. Ваше следующее пиво (пусть даже виртуальное) на мне! !Beer, Привет Фабиан elDietze
Мне удалось заставить это работать, и мой проигрыватель воспроизводил музыку в фоновом режиме, даже если я переключал кадры, но как мне обрабатывать события ОС, такие как «Воспроизведение», «Пауза», «Следующая дорожка» и т. Д., С помощью клавиш мультимедиа? Нужно ли добавлять дубликаты обработчиков событий для каждого просмотра? или есть какой-то способ обрабатывать это глобально в приложении?
Это звучит как совершенно отдельный вопрос. :)

Похожие вопросы