Windows ストア アプリで曲を再生したい。MediaElement
問題は、他のページに移動するときにサウンドの再生が停止してはならないため、ページ間で「共有」したいということです。最新の Caliburn.Micro WinRT ポートを使用しています。
この問題に対する私の最初のアプローチは、2 行のグリッドがある場所MediaElement
に配置することでした。DefaultView
2 行目にはMediaElement
(および再生、一時停止などを処理するすべてのコントロール) が含まれ、1 行目はframe
実際のコンテンツを挿入する別の場所です。
それが機能するには、ハッキングが必要でした。新しいインターフェースを作成しました
public interface INavigationService2 : INavigationService { }
そして私自身のNavigationServiceとして
public class NavigationService : FrameAdapter, INavigationService2
{
public NavigationService(Frame frame, bool treatViewAsLoaded = false)
: base(frame, treatViewAsLoaded) { }
}
今、それをCMに登録しました
public sealed partial class MainView
{
public MainView()
{
this.InitializeComponent();
MainView.InitializeComponentStatic(this);
}
private static bool _isInitialized;
private static void InitializeComponentStatic(MainView mainView)
{
if (_isInitialized) return;
((App)Application.Current).RegisterInstance(typeof(INavigationService2),
null, new NavigationService(mainView.ContentFrame));
_isInitialized = true;
}
}
次に、私StartViewModel
をそのContentFrame
行為にバインドしようとしました
public class MainViewModel : Screen
{
public MainViewModel()
{
this.ContentFrame = new StartViewModel(((App) Application.Current).GetDefaultInstance<INavigationService2>());
}
public DefaultViewModel ContentFrame { get; set; }
}
これを実行するとStartView
、グリッド内に表示されますMainView
が、ナビゲーションは正しいビュー/ビューモデルに移動しなくなります (実際には何らかの方法で MainViewModel を再度読み込みます)。
これは本当に素晴らしくて簡単ではないので、ページ/ビュー間でメディア要素を共有するという元の問題を解決する方法についてのアイデアが必要でした.