如何以编程方式响应Windows 8 Metro中的Snap

有没有办法在Metro应用程序中响应C#中的Snap? 当其中一个页面被快照时,我需要显示另一个页面。 我的想法是通过导航到另一个页面来响应快照。

我发现

var currentView = ApplicationLayout.GetForCurrentView(); currentView.LayoutChanged += new TypedEventHandler(currentView_LayoutChanged); 

但它似乎不再适用于Consumer Preview。 还有另一种方式吗?

在Consumer Preview中,您需要对不同的事件做出反应。 它现在是ViewStateChanged,而不是LayoutChanged。

在Release Preview中,您需要再次对另一个事件作出反应:)现在是SizeChanged,而不是ViewStateChanged。

以前,您的应用程序会执行以下操作来处理视图状态更改:

 using Windows.UI.ViewManagement; // Register for the viewstatechanged event ApplicationView.GetForCurrentView().ViewStateChanged += ViewStateChanged; private void ViewStateChanged(ApplicationView sender, ApplicationViewStateChangedEventArgs e) { // Obtain view state from event payload ApplicationViewState myViewState = e.ViewState; } 

现在应用应该这样做:

 using Windows.UI.ViewManagement; // Register for the window resize event Window.Current.SizeChanged += WindowSizeChanged; private void WindowSizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e) { // Obtain view state by explicitly querying for it ApplicationViewState myViewState = ApplicationView.Value; } 

更多信息在这里

Jowen得到了答案,我只是在这里添加一些WindowSizeChanged代码:

  ApplicationViewState viewState = ApplicationView.Value; if (viewState == ApplicationViewState.Filled) { System.Diagnostics.Debug.WriteLine("viewState is Filled"); } else if (viewState == ApplicationViewState.FullScreenLandscape) { System.Diagnostics.Debug.WriteLine("viewState is FullScreenLandscape"); } else if (viewState == ApplicationViewState.Snapped) { System.Diagnostics.Debug.WriteLine("viewState is Snapped"); } else if (viewState == ApplicationViewState.FullScreenPortrait) { System.Diagnostics.Debug.WriteLine("viewState is FullScreenPortrait"); } else { System.Diagnostics.Debug.WriteLine("viewState is something unexpected"); } 

我发现有点令人惊讶的是,当我将这个占位符代码复制到另一个页面时,它给代码一个有界的矩形,因为我没有“使用Windows.UI.ViewManagement;” 然而,当我在无法识别的代码上盘旋时,它询问“导入文件以获取粘贴的代码?” 我想它(我不知道“它”是VS还是Resharper)正在跟踪已经粘贴的代码,因为它可能是用一个倾斜的角度或两手叉眉来看。