Spe*_*rer 3 overriding back-button messagedialog windows-phone-8.1
我正在开发一个WP 8.1 XAML应用程序.第一页是登录页面,第二页是例如历史页面.会有更多页面,但目前无关紧要.当我按下登录页面上的登录按钮时,会出现第二个(历史记录)页面.如果我按下历史记录页面上的(物理)后退按钮,它将返回登录页面.但我想禁用此功能.取而代之的是,当我按下后退按钮时会出现MessageDialog,如果我在几秒钟内再次按下(例如3秒),应用程序将终止.我试图找到我的问题的答案,但它不能正常工作.我在登录页面上尝试了这个:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
HardwareButtons.BackPressed += HardwareButtons_BackPressed;
}
private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
if (Frame.CurrentSourcePageType.FullName == "MyAppName.History")
Application.Current.Exit();
}
Run Code Online (Sandbox Code Playgroud)
当我按下第二个(历史)页面上的后退按钮时,我的应用程序终止.但是,如果我尝试按下后退按钮,它将导航回登录页面.在此之后,当我再次登录并按下后退按钮时,计数器将为2,应用程序将退出.这是我尝试的代码:
private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
//MessageDialog msgbox = new MessageDialog("This is a popup message");
//await msgbox.ShowAsync();
//e.Handled = true;
backPressCount++;
if (backPressCount==2 && Frame.CurrentSourcePageType.FullName == "MyAppName.History")
Application.Current.Exit();
}
Run Code Online (Sandbox Code Playgroud)
如果我取消注释2个MessageDialog行,则会显示该消息,但我将导航回登录页面.我试图取消注释e.Handled = true;,但它没有帮助.我想我应该禁用历史记录页面上的后退按钮或完全覆盖它.有人对我的问题有所了解吗?
编辑: 我重新考虑后退按钮的行为,因为我不想使用自动收报机来测量2按下之间的时间.而不是这个,我只想要一个带有问题的弹出消息,例如"你真的想退出吗?" 和2个按钮(是和否).它适用于以下代码:
private async void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
e.Handled = true;
MessageDialog dlg = new MessageDialog("Are you sure you want to quit you will loose all your work ?", "Warning");
dlg.Commands.Add(new UICommand("Yes", new UICommandInvokedHandler(CommandHandler1)));
dlg.Commands.Add(new UICommand("No", new UICommandInvokedHandler(CommandHandler1)));
await dlg.ShowAsync();
}
private void CommandHandler1(IUICommand command)
{
var label = command.Label;
switch (label)
{
case "Yes":
{
Application.Current.Exit();
break;
}
case "No":
{
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我在弹出窗口中选择答案之前导航到登录页面.如果我按下是,我的应用程序退出,当我选择否时不执行任何操作.但此刻我正在登录页面上.我试图使用dlg.Show()而不是dlg.ShowAsync()但它缺少.所以我只能使用异步方法,但在这种情况下,页面导航到后台登录,因为当我按下后退按钮时总是调用NavigationHelper.问题是什么?
如果这是你真正想做的事情,请考虑一下.更加用户友好的流程是保存数据并让用户退出应用程序并返回.还要考虑如果用户以不同的方式退出,例如窗口或相机按钮会发生什么.
也就是说,如果这是您唯一的导航处理(在BlankPage模板中尝试),您列出的代码将起作用.我怀疑它不是唯一的,你正在使用像BasicPage这样更全面的模板中的NavigationHelper.在这种情况下,NavigationHelper的GoBackCommand可能会触发并调用Frame.GoBack.
您可以通过在NavigationHelper的GoBackCommand属性上设置自己的RelayCommand来覆盖此行为:
RelayCommand _checkedGoBackCommand;
public BasicPage1()
{
this.InitializeComponent();
this.navigationHelper = new NavigationHelper(this);
this.navigationHelper.LoadState += this.NavigationHelper_LoadState;
this.navigationHelper.SaveState += this.NavigationHelper_SaveState;
_checkedGoBackCommand = new RelayCommand(
() => this.CheckGoBack(),
() => this.CanCheckGoBack()
);
navigationHelper.GoBackCommand = _checkedGoBackCommand;
}
private bool CanCheckGoBack()
{
return true;
}
private async void CheckGoBack()
{
Debug.WriteLine("CheckGoBack");
MessageDialog dlg = new MessageDialog("Are you sure you want to quit you will loose all your work ?", "Warning");
dlg.Commands.Add(new UICommand("Yes", new UICommandInvokedHandler(CommandHandler1)));
dlg.Commands.Add(new UICommand("No", new UICommandInvokedHandler(CommandHandler1)));
await dlg.ShowAsync();
}
private void CommandHandler1(IUICommand command)
{
var label = command.Label;
switch (label)
{
case "Yes":
{
Application.Current.Exit();
break;
}
case "No":
{
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)