4

MediaElement を使用して、メトロ アプリで音楽を再生しています。別のページに移動しても音楽を再生し続けたいです。

次のスレッドでは、その質問も尋ねられました

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 にアクセスしようとしても、常に null を返します。

デモ用に小さなサンプル プロジェクトを作成しました。

サンプルプロジェクト

何か案は ?前もって感謝します !

よろしくファビアン

4

1 に答える 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);
    }
}
于 2012-06-07T17:32:40.310 に答える