【问题标题】:How to programmatically respond to Snap in Windows 8 Metro如何在 Windows 8 Metro 中以编程方式响应 Snap
【发布时间】:2012-11-08 06:16:58
【问题描述】:

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

我找到了

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

但它似乎不再适用于 Consumer Preview。还有其他方法吗?

【问题讨论】:

标签: c# windows-8 winrt-xaml


【解决方案1】:

在 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;
}

More info here

【讨论】:

    【解决方案2】:

    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)正在跟踪已粘贴的代码,因为它可能会用斜角或叉腰的眉毛来查看。

    【讨论】:

    • 不错,这样会更好。
    • 'ApplicationViewState 对于 Windows 8.1 之后的版本可能会更改或不可用。相反,直接查询窗口布局大小。又过时了。
    【解决方案3】:

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

    【讨论】:

    • 这个答案已经过时了。在下面查看我的帖子以获取发布预览
    • 公平地说,答案的前三个单词 FOR CONSUMER PREVIEW 没有错。当前版本不正确,但不等于错误。
    猜你喜欢
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 2015-02-02
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多