かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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