かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

UWPで複数ウィンドウを出す

UWPで複数ウィンドウの出し方です。 基本的には、CoreApplicationのCreateNewViewで新しいCoreApplicationViewを作って、そいつのDispatcher上で新しいWindowを表示してやるようなイメージです。コードでいうとこんな感じ。

private async void button_Click(object sender, RoutedEventArgs e)
{
    var currentViewId = ApplicationView.GetForCurrentView().Id;
    await CoreApplication.CreateNewView().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
    {
        Window.Current.Content = new Frame();
        ((Frame)Window.Current.Content).Navigate(typeof(NewWindowPage));
        Window.Current.Activate();
        await ApplicationViewSwitcher.TryShowAsStandaloneAsync(
            ApplicationView.GetApplicationViewIdForWindow(Window.Current.CoreWindow),
            ViewSizePreference.Default,
            currentViewId,
            ViewSizePreference.Default);
    });
}

複数ウィンドウを出したときに気を付けないといけないのは、それぞれのウィンドウが別のスレッドで動いているということです。 何か値の共有をするときは、最終的なPropertyChangedやCollectionChangedのイベントの発火を各ウィンドウのUIスレッド上でやらないといけません。 サンプルでは、ReactivePropertyを使ってスレッドを切り替えています。

github.com

f:id:okazuki:20151023220301p:plain