一个通用的 windows 应用程序如何拥有多个独立的 windows(如微软的应用程序“照片”)?
How can a universal windows app have multiple independent windows (Like Microsoft's app “Photos”)?
我知道如何使用 TryShowAsStandaloneAsync
打开额外的 windows。但是,如果原来的 window 被关闭 - TryShowAsStandaloneAsync
失败(为什么?)。 And I don't know how to "revive" it(-原window).
但是 "Photos" 似乎可以像桌面应用程序一样正常工作。它是如何做到的? (我想效仿。)一个人可以打开一个带有图像的 window,打开另一个,关闭第一个,并且仍然能够打开更多 windows.
任何方式都可以 - 在没有显示主 window 的情况下启动 windows 的某种方式,或者在关闭后恢复主 window 的某种方式(为了它成为必须打开的新 window)或其他方式。
我不确定您是否使用 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/
看看MultipleViews sample app。此应用确实存在您描述的问题。
您创建的每个视图都有自己的 UI 线程,因此也有调度程序。
这个应用程序的关键是 TryShowAsStandaloneAsync
是从当前活动 window 的调度程序调用的。
在示例的 OnLaunched
事件中,代码使用启动参数中的视图 ID 查找对当前打开视图的引用。然后它使用与该视图关联的调度程序在该视图的 UI 线程上使用 Dispatcher.RunAsync
调用 UI 代码。您应该使用打开的线程 window 来调用 TryShowAsStandaloneAsync
以启动您的新主视图。然后,您可以使用新主视图的调度程序调用 Window.Activate
。
关闭主 window 后回答 TryShowAsStandaloneAsync
失败的原因:
我认为 TryShowAsStandaloneAsync
尝试使用主视图作为锚视图(即 window 放置新的 window 相对)。
关闭主 window TryShowAsStandaloneAsync
失败,因为它没有锚点视图。
解决方法是通过重载指定打开的视图的 anchorViewId
(您在关闭主 window 之前打开的新 windows 之一) TryShowAsStandaloneAsync:
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);
来自 .
我知道如何使用 TryShowAsStandaloneAsync
打开额外的 windows。但是,如果原来的 window 被关闭 - TryShowAsStandaloneAsync
失败(为什么?)。 And I don't know how to "revive" it(-原window).
但是 "Photos" 似乎可以像桌面应用程序一样正常工作。它是如何做到的? (我想效仿。)一个人可以打开一个带有图像的 window,打开另一个,关闭第一个,并且仍然能够打开更多 windows.
任何方式都可以 - 在没有显示主 window 的情况下启动 windows 的某种方式,或者在关闭后恢复主 window 的某种方式(为了它成为必须打开的新 window)或其他方式。
我不确定您是否使用 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/
看看MultipleViews sample app。此应用确实存在您描述的问题。
您创建的每个视图都有自己的 UI 线程,因此也有调度程序。
这个应用程序的关键是 TryShowAsStandaloneAsync
是从当前活动 window 的调度程序调用的。
在示例的 OnLaunched
事件中,代码使用启动参数中的视图 ID 查找对当前打开视图的引用。然后它使用与该视图关联的调度程序在该视图的 UI 线程上使用 Dispatcher.RunAsync
调用 UI 代码。您应该使用打开的线程 window 来调用 TryShowAsStandaloneAsync
以启动您的新主视图。然后,您可以使用新主视图的调度程序调用 Window.Activate
。
关闭主 window 后回答 TryShowAsStandaloneAsync
失败的原因:
我认为 TryShowAsStandaloneAsync
尝试使用主视图作为锚视图(即 window 放置新的 window 相对)。
关闭主 window TryShowAsStandaloneAsync
失败,因为它没有锚点视图。
解决方法是通过重载指定打开的视图的 anchorViewId
(您在关闭主 window 之前打开的新 windows 之一) TryShowAsStandaloneAsync:
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);
来自