読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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

UWP ReactiveProperty

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