在一个应用中,是可以支持多窗口的,每个窗口都是独立存在,可拖动放大缩小关闭。适当的使用多窗口可提高用户体验。
官方为使用多窗口场景提供了一些建议:
- 为用户提供一种返回主窗口的方式
- 为用户提供一种清晰的方式去创建一个新的窗口
- 为用户提供明显的标题去区分不同的窗口内容
- 监听 consolidated event
- 如果新的窗口替代原来的窗口(换内容),请提供一个自定义的动画效果提示切换
- 在提高生产效率和多任务的前提下开启新窗口
- 设计新的窗口使用户能在里面完成任务
- 如果可以导航到一个页面就能达到效果就不要去开启新窗口
- 不要去要求用户打开一个新窗口去完成应用的主要任务
下面为创建一个新窗口并显示的代码,首先得新建一个页面用来放新窗口显示如:BlankPage1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
CoreApplicationView newCoreView = CoreApplication.CreateNewView(); ApplicationView newAppView = null; int mainViewid = ApplicationView.GetForCurrentView().Id; await newCoreView.Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { newAppView = ApplicationView.GetForCurrentView(); Window.Current.Content = new BlankPage1(mainViewid); Window.Current.Activate(); }); int mainViewId = ApplicationView.GetApplicationViewIdForWindow( CoreApplication.MainView.CoreWindow); await ApplicationViewSwitcher.TryShowAsStandaloneAsync( newAppView.Id, ViewSizePreference.UseHalf, mainViewId, ViewSizePreference.UseHalf); /////////////////////////////////在原来的窗口上显示新的窗口的内容,而不弹出新的窗口 await ApplicationViewSwitcher.PrepareForCustomAnimatedSwitchAsync( newAppView.Id, mainViewId, ApplicationViewSwitchingOptions.SkipAnimation); |
从次窗口返回主窗口首先使 要把主窗口的viewID 传进去,如下在次窗口的页面里需要保存主窗口的ID;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public sealed partial class BlankPage1 : Page { private int mainViewId; public BlankPage1() { this.InitializeComponent(); } //构造时传入主窗口的view ID public BlankPage1(int mainViewId) { this.InitializeComponent(); this.mainViewId= mainViewId; } private async void button_Click(object sender, RoutedEventArgs e) { //点击返回主窗口 await ApplicationViewSwitcher.SwitchAsync(mainViewId); //返回时同时关闭次窗口 //await ApplicationViewSwitcher.SwitchAsync(mainViewId, // ApplicationView.GetForCurrentView().Id, // ApplicationViewSwitchingOptions.ConsolidateViews); } } |
UWP窗口相关内容:
CoreApplication类对象是整个应用的核心对象,应用在初始化的时候会构建一个单列。
CoreApplicationView类标识整个窗口,以及消息驱动线程,由CoreApplication创建。每个窗口都在自己单独的现场上创建UI类容,这也是在多窗口下通信会带来的跨线程操作UI的坑
ApplicationView类,每个核心View管理下都有个这个对象,管理窗口的一些属性,通过GetForCurrentView 可以很容易获取到
CoreWindow类 核心View 中实际窗口操作管理。包键盘,鼠标等操作事件
Window类可视层类容,包装CoreWindow,呈现XAML类容
以上内容只是个皮毛,只能期盼大神能对关于UWP整个应用的对象结构能深扒一下