通用Windows应用程序如何具有多个独立窗口(如Microsoft的应用程序“照片”)?

时间:2015-11-13 12:01:10

标签: c# windows-runtime windows-store-apps win-universal-app uwp

我知道如何使用TryShowAsStandaloneAsync打开其他窗口。但是,如果原始窗口关闭 - TryShowAsStandaloneAsync失败(为什么?)。 And I don't know how to "revive" it(原始窗口)。

但“照片”似乎与桌面应用程序一样正常。它是如何做到的? (我想模仿那个。)可以打开一个带有图像的窗口,打开另一个窗口,关闭第一个窗口,然后仍然可以打开更多窗口。

任何方式都可以 - 在没有主窗口显示的情况下启动窗口的某种方式,或者在关闭后重新启动主窗口的某种方式(为了使它成为必须打开的新窗口),或者某些方法其他方式。

3 个答案:

答案 0 :(得分:4)

查看MultipleViews sample app。这个应用确实有您正在描述的问题。

您创建的每个视图都有自己的UI线程,因此也有调度程序。 此应用程序的关键是从当前活动窗口的调度程序调用{​​{1}}。

在示例的TryShowAsStandaloneAsync事件中,代码使用启动参数中的视图ID查找对当前打开的视图的引用。然后,它使用与该视图关联的调度程序在该视图的UI线程上使用OnLaunched调用UI代码。您应该使用打开窗口的该线程来调用Dispatcher.RunAsync来启动新的主视图。然后,您可以使用新的主视图调度程序调用{​​{1}}。

答案 1 :(得分:1)

在关闭主窗口后回答TryShowAsStandaloneAsync失败的原因:

我认为TryShowAsStandaloneAsync尝试使用主视图作为锚视图(即,相对于新窗口放置的窗口)。

关闭主窗口TryShowAsStandaloneAsync失败,因为它没有锚视图。

解决方法是通过TryShowAsStandaloneAsync的重载指定打开的视图的anchorViewId(在关闭主窗口之前打开的新窗口之一):

await ApplicationViewSwitcher.TryShowAsStandaloneAsync(
    viewIdToShow, // Id of a new view, or of your hidden main view
    ViewSizePreference.Default,
    anchorViewId, // Id of one of your visible windows
    ViewSizePreference.Default);

来自this answer

答案 2 :(得分:-3)

我不确定你是否使用Dispatcher.RunAsync来创建视图,即:

async private void Button_Click(object sender, RoutedEventArgs e)
 {
 CoreApplicationView newView = CoreApplication.CreateNewView();
 int newViewId = 0;

await newView.Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
 {
 var frame = new Frame();
 frame.Navigate(typeof(MainPage), newViewId);
 Window.Current.Content = frame;

// In Windows 10 UWP we need to activate our view first.
 // Let's do it now so that we can use TryShow...() and SwitchAsync().
 Window.Current.Activate();

newViewId = ApplicationView.GetForCurrentView().Id;
 });

 bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId);
 }

有关详细信息,请参阅:https://daxsnippets.wordpress.com/2015/07/09/windows-10-create-views/