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

时间:2012-04-28 10:14:12

标签: c# windows-8 winrt-xaml

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

我找到了

var currentView = ApplicationLayout.GetForCurrentView();
currentView.LayoutChanged += new TypedEventHandler<ApplicationLayout, ApplicationLayoutChangedEventArgs>(currentView_LayoutChanged);

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

3 个答案:

答案 0 :(得分:24)

在发布预览版中,您需要再次对另一个事件作出反应:) 它现在是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;
}

More info here

答案 1 :(得分:9)

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)正在跟踪已粘贴的代码,因为它可能会以一个倾斜的角度或两手叉眉来看待。

答案 2 :(得分:5)

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