c# - 通过 UWP 应用中的框架返回导航
问题描述
我有一个 UWP 应用程序,它有 3 页,第三页包含一个加载多个框架的框架标签。假设我导航到第 1 页->第 2 页->第 3 页->第 1 帧->第 2 帧->第 3 帧。如果我从第 3 帧和第 2 帧按下后退按钮,它将转到第 2 页而不是第 2 帧和第 1 帧分别。我有一个处理后退按钮事件的常用方法,它采用与第 3 页的第 1,2 和第 3 帧相同的根框架,然后返回到其后页第 2 页。那么我该如何返回到框架的根页面回来。下面是我在 App.xaml.cs 中常用的返回方法。请帮忙。
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
Frame rootFrame = Window.Current.Content as Frame;
Windows.UI.Core.SystemNavigationManager.GetForCurrentView().BackRequested += App_BackRequested;
}
}
private void App_BackRequested(object sender, Windows.UI.Core.BackRequestedEventArgs e)
{
e.Handled = On_BackRequested();
}
private bool On_BackRequested()
{
Frame rootFrame = Window.Current.Content as Frame;
if (rootFrame.CanGoBack)
{
rootFrame.GoBack();
return true;
}
return false;
}
public HomeView()
{
this.InitializeComponent();
var vm = new HomeViewModel(new UserService(), new SubscriptionService(), new TransactionService(),new GameService());
this.DataContext = vm;
WalletBtn.Foreground = new SolidColorBrush(Colors.White);
PaymentGrid = BuyModal;
//PowerPassGameListGrid = PowerPassGameGrid;
// SystemNavigationManager.GetForCurrentView().BackRequested += HomePage_BackRequested;
PointBalance = wallet;
//QueuedGames = QueueGame;
//PowerPassSubscriptionGrid = PowerPass;
SubmitPopUp = SuccessPopUp;
RecentActivityGrid = RecentActivityModel;
CurrentlyPickedPopUp = GamePickUp;
PowerUpNavigationGrid = NavigationGrid;
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
string firstName = (string)ApplicationData.Current.LocalSettings.Values["FirstName"];
string lastName = (string)ApplicationData.Current.LocalSettings.Values["LastName"];
if (firstName != null && lastName != null)
{
welcomeMessage.Text = "Hi, " + firstName;
}
}
public void MyWalletButton_Click(object sender, RoutedEventArgs e)
{
PowerPassBtn.Foreground = new SolidColorBrush(Colors.Gray);
WalletBtn.Foreground = new SolidColorBrush(Colors.White);
}
public void PowerPassButton_Click(object sender, RoutedEventArgs e)
{
PowerPassSelection();
}
//private void HomePage_BackRequested(object sender, BackRequestedEventArgs e)
//{
// e.Handled = true;
// this.Frame.Navigate(typeof(LoginUsernameView));
//}
private void ButtonGotFocus(object sender, RoutedEventArgs e)
{
(sender as Button).Background = new SolidColorBrush(Colors.Green);
}
private void ButtonLostFocus(object sender, RoutedEventArgs e)
{
(sender as Button).Background = new SolidColorBrush(Colors.Transparent);
}
private void QueueButtonGotFocus(object sender, RoutedEventArgs e)
{
(sender as Button).Background = new SolidColorBrush(Colors.DeepSkyBlue);
}
private void QueueButtonLostFocus(object sender, RoutedEventArgs e)
{
(sender as Button).Background = new SolidColorBrush(Colors.Transparent);
}
private static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
{
var parent = VisualTreeHelper.GetParent(dependencyObject);
if (parent == null) return null;
var parentT = parent as T;
return parentT ?? FindParent<T>(parent);
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
NavigationParameterDTO parameter = e.Parameter as NavigationParameterDTO;
if (parameter != null)
{
if (parameter.FrameName == "WelcomeView")
{
HomeViewModel vm = this.DataContext as HomeViewModel;
vm.PowerPassWelcomeFrame.Execute(null);
PowerPassSelection();
}
else if(parameter.FrameName == "CheckOut")
{
HomeViewModel vm = this.DataContext as HomeViewModel;
vm.PowerPassGameCheckOutMethod.Execute(null);
PowerPassSelection();
}
else if(parameter.FrameName== "SignUp")
{
HomeViewModel vm = this.DataContext as HomeViewModel;
vm.PowerPassFrame.Execute(null);
PowerPassSelection();
}
else
{
HomeViewModel vm = this.DataContext as HomeViewModel;
vm.PowerPassHomeFrame.Execute(null);
PowerPassSelection();
}
}
}
Xaml
<Button Style="{StaticResource PowerUpButtonStyle}" x:Uid="Profile" FontSize="36" Margin="0,60,0,0" Name="SettingsBtn" XYFocusDown="{x:Bind SettingsBtn}" FontFamily="Segoe Pro" Foreground="Gray" FocusVisualPrimaryThickness="0,0,0,3" FocusVisualMargin="10,0">
<Button.Background>
<SolidColorBrush Opacity="0"/>
</Button.Background>
<Button.Resources>
<ResourceDictionary>
<ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Light">
<SolidColorBrush x:Key="ButtonForegroundPointerOver" Color="White"/>
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
</ResourceDictionary>
</Button.Resources>
</Button>
</StackPanel>
<Image Source="/Assets/Images/PURlogo_large.png" HorizontalAlignment="Left" Margin="70,950" Width="212" Height="78"/>
</Grid>
</StackPanel>
<Frame x:Name="MainFrame" Grid.Column="1" Content="{Binding FrameData,Mode=OneWay}" >
</Frame>
<Grid Background="Red" Visibility="Collapsed" x:Name="testgrid">
<TextBlock Text="hello world"></TextBlock>
</Grid>
</Grid>
解决方案
使用Window.Current.Content
为您提供了应用程序的根目录Frame
。如果要检查Page3
当前是否打开并利用其框架,则必须执行以下操作:
private bool On_BackRequested()
{
Frame rootFrame = Window.Current.Content as Frame;
if (rootFrame.Content is Page3 page3 )
{
var innerFrame = page3.GetInnerFrame(); //implement this method in Page3
if (innerFrame.CanGoBack)
{
innerFrame.GoBack();
return true;
}
}
if (rootFrame.CanGoBack)
{
rootFrame.GoBack();
return true;
}
return false;
}
该GetInnerFrame
方法将在Page3
代码隐藏中,并且只会返回页面上的框架。
上面的代码只会使用Page3
. 如果您进一步嵌套,您将不得不再次使用此框架Content
等等。
推荐阅读
- javascript - 尝试使用 react-native-mmkv-storage 框架但未存储数据
- php - 使用 laravel 6.2 登录失败
- ios - 调整 UITextView 大小时缩放字体大小
- c++ - clang-format 是否有办法运行自定义正则表达式然后对匹配进行操作?
- android - Android 库模块中的身份验证
- angular - 如何在我的环境文件中动态插入值?
- java - JAVA中的JsonProperty - 使用相同的属性定义两个变量
- python - 如何从列表中删除不同的值
- typescript - 在 Meteor 中使用 Mongo 聚合
- amazon-web-services - 亚马逊 SES 的偶尔问题