【问题标题】:How to cancel the task?如何取消任务?
【发布时间】:2016-12-27 08:44:52
【问题描述】:

我在我的应用程序中覆盖 BackButton 并显示 MessageDialog。

 public Scenario_3()
    {
        this.InitializeComponent();
        Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;
    }


private async void HardwareButtons_BackPresseed(object sender, BackPressedEventArgs e)
    {
        e.Handled = true;
        var dialog = new MessageDialog("Do you want exit?");

        dialog.Commands.Add(new Windows.UI.Popups.UICommand("yes") { Id = 0 });
        dialog.Commands.Add(new Windows.UI.Popups.UICommand("no") { Id = 1 });

        dialog.DefaultCommandIndex = 0;
        dialog.CancelCommandIndex = 1;

        var result = await dialog.ShowAsync();

        if (result.Label == "yes")
        {
            this.Frame.Navigate(typeof(BlankPage1));

            ((Frame)Window.Current.Content).BackStack.Clear();
        }

导航到 BlankPage1 后,如果按下 BackButton,我会再次看到 MessageDialog。 导航后如何取消此覆盖?

【问题讨论】:

  • 如果没有好的minimal reproducible example 和更清晰的问题陈述,您的问题很难理解。但是,当您离开当前页面时,您似乎忘记了取消订阅 BackPressed 事件。
  • 您是否尝试过例如使用 flag 来检查您的按钮/方法是否曾被调用过?
  • 彼得·杜尼霍,谢谢!您的建议解决了这个问题。
  • 如果@Romasz 可以将他的评论作为答案发布,您可以将其标记为答案,这样更多寻找解决方案的人可以快速找到一个好的答案。
  • @TomášHübelbauer 如果没有从 OP 获得更多信息,很难在这里写出一个好的答案 - 如果他使用宽应用程序返回事件或仅针对特定页面 + 更多详细信息。彼得的建议似乎也解决了 OP 的问题。

标签: c# windows windows-phone-8.1 uwp


【解决方案1】:

根据您对我评论的回复,您似乎只是在离开该页面时忘记取消订阅BackPressed 事件。这样做将确保仅在需要时调用事件处理程序。

例如:

private async void HardwareButtons_BackPresseed(object sender, BackPressedEventArgs e)
{
    e.Handled = true;
    var dialog = new MessageDialog("Do you want exit?");

    dialog.Commands.Add(new Windows.UI.Popups.UICommand("yes") { Id = 0 });
    dialog.Commands.Add(new Windows.UI.Popups.UICommand("no") { Id = 1 });

    dialog.DefaultCommandIndex = 0;
    dialog.CancelCommandIndex = 1;

    var result = await dialog.ShowAsync();

    if (result.Label == "yes")
    {
        // Leaving this page. Stop listening for Back button presses.
        Windows.Phone.UI.Input.HardwareButtons.BackPressed -= HardwareButtons_BackPressed;

        this.Frame.Navigate(typeof(BlankPage1));

        ((Frame)Window.Current.Content).BackStack.Clear();
    }

【讨论】:

  • 正确。即使您离开页面,它也会继续接收事件,直到它被 GCed。在NavigatedFrom 覆盖中取消订阅会更好,以防您以后添加代码以编程方式返回。
猜你喜欢
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
相关资源
最近更新 更多