如何在 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;
}
我想在 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;
}