今天我们来介绍一下 windows8.1 中 全新的ApplicationViewSwitcher
通过他 我们实现metro 应用的多窗口处理(可用在浏览器、博客、论坛应用) 在不同的业务中可以得到充分的利用
那么接下来我们开始介绍如何 进行多窗口创建、切换
首先我们需要创建新的View
1.创建
一个新的View 需要一个新的UI线程来控制,那么这个View 需要在一个新的CoreApplicationView的UI线程中创建
我们需要调用该方法CoreApplication.CreateNewView().Dispatcher.RunAsync (注意: 如果没有在新的CoreApplicationView中
创建那么 需要打开的内容会在本窗体中直接呈现无法做到切换)
然后来在RunAsync中
var frame = new Frame();
frame.Navigate(typeof(xxxx), "");
Window.Current.Content = frame;
这样一个窗体就创建完毕了,窗体的内容可以自己任意指定
之后我们在加上 var viewId = ApplicationView.GetApplicationViewIdForWindow(window);
这个viewId 在之后切换时会用到 根据Id 来获取 所创建的对应View
2.并排显示/切换
创建好View 并拿到id 这样我们可以利用
ApplicationViewSwitcher.TryShowAsStandaloneAsync 方法来进行view的显示 这是一个异步方法
//
// 摘要:
// 在屏幕上与原始窗口相邻的位置显示应用程序的另一个窗口(应用程序视图)
//
// 参数:
// viewId:
// 要显示的新窗口的 ID。
//
// 返回结果:
// 如果调用成功,则异步返回 true;否则返回 false。
[Overload("TryShowAsStandaloneAsync")]
[SupportedOn(100859904, Platform.Windows)]
public static IAsyncOperation<bool> TryShowAsStandaloneAsync(int viewId);
//
// 摘要:
// 在屏幕上与原始窗口相邻的位置显示应用程序的另一个窗口(应用程序视图)
//
// 参数:
// viewId:
// 要显示的新窗口的 ID。
//
// sizePreference:
// 新窗口的首选常规大小。
//
// 返回结果:
// 如果调用成功,则异步返回 true;否则返回 false。
[Overload("TryShowAsStandaloneWithSizePreferenceAsync")]
[SupportedOn(100859904, Platform.Windows)]
public static IAsyncOperation<bool> TryShowAsStandaloneAsync(int viewId, ViewSizePreference sizePreference);
//
// 摘要:
// 在屏幕上与原始窗口相邻的位置显示应用程序的另一个窗口(应用程序视图)。
//
// 参数:
// viewId:
// 要显示的新窗口的 ID。
//
// sizePreference:
// 新窗口的首选常规大小。
//
// anchorViewId:
// 所调用(定位)窗口的 ID。
//
// anchorSizePreference:
// 调用成功时,此调用窗口的首选新常规大小。
//
// 返回结果:
// 如果调用成功,则异步返回 true;否则返回 false。
[Overload("TryShowAsStandaloneWithAnchorViewAndSizePreferenceAsync")]
[SupportedOn(100859904, Platform.Windows)]
public static IAsyncOperation<bool> TryShowAsStandaloneAsync(int viewId, ViewSizePreference sizePreference, int anchorViewId, ViewSizePreference anchorSizePreference);
这些方法我就不描述了 直接看api即可
ViewSizePreference 是一个枚举
Windows8.1 中metro 应用的显示大小更加多样化了 从之前的snap 变为 Half 、More、 Minimum 在不同分辨率下可以最多容纳不同规格的view
// 摘要:
// 定义一组可能的常规窗口(应用程序视图)大小首选项。
[SupportedOn(100859904, Platform.Windows)]
[Version(100859904)]
public enum ViewSizePreference
{
// 摘要:
// 未为应用程序指定窗口大小首选项。将由 Windows 而不是该应用程序设置大小首选项,默认为 UseHalf。
[SupportedOn(100859904, Platform.Windows)]
Default = 0,
//
// 摘要:
// 窗口使用 50% 以下的可用水平屏幕像素。
[SupportedOn(100859904, Platform.Windows)]
UseLess = 1,
//
// 摘要:
// 窗口使用 50% (一半)的可用水平屏幕像素。
[SupportedOn(100859904, Platform.Windows)]
UseHalf = 2,
//
// 摘要:
// 窗口使用 50% 以上的可用水平屏幕像素。
[SupportedOn(100859904, Platform.Windows)]
UseMore = 3,
//
// 摘要:
// 窗口使用应用程序清单(例如 package.appxmanifest)中指定的最小水平像素宽度(320 或 500 像素)。
[SupportedOn(100859904, Platform.Windows)]
UseMinimum = 4,
//
// 摘要:
// 窗口没有可见组件。
[SupportedOn(100859904, Platform.Windows)]
UseNone = 5,
}
通过上述操作
我们使刚创建的view 并排显示 达到了多窗口的目的
那么接下来 要切换到新的view 就更加容易了 只需要通过我们刚刚拿到的id 通过 ApplicationViewSwitcher.SwitchAsync 进行View的切换
3.页面间切换的动画
之前我们实现了 多页面的创建 以及 切换的功能,但是这种切换会显得非常生硬,那么我们需要通过一些动画来使他的体验变得更好。
首先需要确认该页面是否切换过 如果为切换 我们将执行一段动画来完成页面切换
//
// 摘要:
// 使应用程序准备使用自定义动画在两个窗口之间以可视方式进行转换。
//
// 参数:
// toViewId:
// 从其切换应用程序的窗口的 ID。
//
// fromViewId:
// 向其切换应用程序的窗口的 ID。
//
// options:
// 指定视图切换行为的枚举值。
//
// 返回结果:
// 如果调用成功,则异步返回 true;否则返回 false。
[SupportedOn(100859904, Platform.Windows)]
public static IAsyncOperation<bool> PrepareForCustomAnimatedSwitchAsync(int toViewId, int fromViewId, ApplicationViewSwitchingOptions options);
但Prepare返回false时 就表示该页面并没有准备好
那么我们可以在此之前 对目前的页面执行一段storyboard 等storyboard 执行完毕之后再调用switch 进行切换
同时目标页面也可以准备一段animation来进行展示
code:
http://download.csdn.net/detail/wangrenzhu2011/7271485
sample 中所用到的AnimationDescription 用法将在下一篇中讲到