如何在 UWP 应用程序中使用后退功能来更改网格的可见性?

How to use the back function in UWP apps to change visibility of a grid?

我想在 App.xaml.cs 文件中使用 UWP 中的后退函数来更改 MainPage.xaml 文件中网格 (grid1) 的可见性 属性。

//Go Back
        public void App_BackRequested(object sender, Windows.UI.Core.BackRequestedEventArgs e)
        {
            if(MainPage.MyGlobals.pageLocation == 0)
            {
                //Do Nothing
            }

            else if(MainPage.MyGlobals.pageLocation == 1)
            {
                MainPage.grid1.Visibility = Visibility.Collapsed;

                MainPage.MyGlobals.pageLocation = 0;
            }
        }

我知道从不同的页面更改 xaml 元素的属性不是典型的做法,但我真的很想更改后退功能在此应用程序中的工作方式。我相信我必须公开网格,但即使我(认为我)找到了一种方法来做到这一点,我仍然无法按照我在代码中编写的方式更改网格的属性。

它不起作用,因为您试图访问网格,就好像它是 MainPage 的静态 属性。您需要引用 MainPage 实例来操作网格,但总而言之,这是一个非常糟糕的做法。您应该看看 UWP/WP 8.1 导航事件。

正如您所提到的,从不同的页面更改 XAML 元素的属性不是一个好习惯。我们可以像下面这样在 MainPage 中使用 SystemNavigationManager.BackRequested event 来改变网格的可见性。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    SystemNavigationManager.GetForCurrentView().BackRequested += Page_BackRequested;
}

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    SystemNavigationManager.GetForCurrentView().BackRequested -= Page_BackRequested;
}

private void Page_BackRequested(object sender, BackRequestedEventArgs e)
{
    if (MyGrid.Visibility == Visibility.Visible)
    {
        MyGrid.Visibility = Visibility.Collapsed;
        e.Handled = true;
    }
    else
    {
        if (this.Frame.CanGoBack)
        {
            this.Frame.GoBack();
            e.Handled = true;
        }
    }
}

并且如果您想利用 App.xaml.cs 中的返回函数并在 MainPage 中使用不同的函数,您可以在 App 中添加一个包装 [=16] 的事件=] 以允许其他页面通过订阅此事件来覆盖默认行为,如下所示:

public event EventHandler<BackRequestedEventArgs> BackRequested;

private void App_BackRequested(object sender, BackRequestedEventArgs e)
{
    BackRequested?.Invoke(sender, e);

    Frame rootFrame = Window.Current.Content as Frame;

    if (!e.Handled && rootFrame != null && rootFrame.CanGoBack)
    {
        rootFrame.GoBack();
        e.Handled = true;
    }
}

然后在 MainPage 中订阅和取消订阅此事件,例如:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    (Application.Current as App).BackRequested += Page_BackRequested;
}

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    (Application.Current as App).BackRequested -= Page_BackRequested;
}