Windows Phone 8.1使用c#使用MessageDialog关闭应用程序确认



我有一个问题与 windows . ui .弹出。MessageDialog 类。事情是:
我想问用户如果(s)他想关闭应用程序,当点击后退按钮(在第一个)。我尝试了两种方法:
首先是设置BackPressed方法async:

private async void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e)
{
    Windows.UI.Popups.MessageDialog logout = new Windows.UI.Popups.MessageDialog("Do You want to close the app?");
    logout.Commands.Add(new Windows.UI.Popups.UICommand("Yes", Exit));
    logout.Commands.Add(new Windows.UI.Popups.UICommand("No"));
    await logout.ShowAsync();
}
第二个是使用System.Threading.Tasks.Task.WaitAny(…)方法:
private void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e)
{
    Windows.UI.Popups.MessageDialog logout = new Windows.UI.Popups.MessageDialog("Do You want to close the app?");
    logout.Commands.Add(new Windows.UI.Popups.UICommand("Yes", Exit));
    logout.Commands.Add(new Windows.UI.Popups.UICommand("No"));
    System.Threading.Tasks.Task.WaitAny(logout.ShowAsync().AsTask());
}

我得到的是:
首先:MessageDialog只显示了一秒钟,然后app最小化,切换到它,并按下后退按钮,只是最小化应用再次,但MessageDialog不显示)。
第二:它是一个死锁(点击"是"后,MessageDialog关闭,但是Exit()方法没有被调用,应用程序冻结)。

首先:

Microsoft建议应用程序不要以编程方式关闭自己。

看到:

应用生命周期- Windows应用开发

那一页写着:

你不能在你的应用程序中包含任何使用户能够关闭你的应用程序的UI,否则它将无法通过商店认证过程。

虽然我知道商店里有一些应用程序会这样做。


无论如何,在HardwareButtons_BackPressed事件处理程序中,需要e.Handled = true;来防止应用程序关闭。这也适用于在应用程序中向后导航。

除此之外,应该检查Frame.CanGoBack,看看应用程序是应该导航还是关闭。

同样,您应该不需要使用任务,而只需等待MessageDialog.ShowAsync(),尽管您可以创建一个返回布尔值的任务,告诉是否继续。


下面是一个完整的代码示例,用于处理在帧堆栈中向后导航,并显示一个消息对话框,询问是否在到达第一帧时关闭应用程序:

App.xaml.cs:

using Windows.Phone.UI.Input;
using Windows.UI.Popups;
public sealed partial class App : Application
{
    public App()
    {
        HardwareButtons.BackPressed += HardwareButtons_BackPressed;
    }
    private async void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
    {
        Frame frame = Window.Current.Content as Frame;
        if (frame == null) { return; }
        e.Handled = true;
        if (frame.CanGoBack) { frame.GoBack(); return; }
        else
        {
            string content = "Do you want to close the app?";
            string title = "Close Confirmation";
            MessageDialog confirmDialog = new MessageDialog(content, title);
            confirmDialog.Commands.Add(new UICommand("Yes"));
            confirmDialog.Commands.Add(new UICommand("No"));
            var confirmResult = await confirmDialog.ShowAsync();
            // "No" button pressed: Keep the app open.
            if (confirmResult != null && confirmResult.Label == "No") { return; }
            // "Back" or "Yes" button pressed: Close the app.
            if (confirmResult == null || confirmResult.Label == "Yes") { Current.Exit(); }
        }
    }
}

最新更新