C# 以编程方式关闭MessageDialog

C# 以编程方式关闭MessageDialog,c#,windows-runtime,winrt-xaml,windows-phone-8.1,messagedialog,C#,Windows Runtime,Winrt Xaml,Windows Phone 8.1,Messagedialog,在Windows Phone 8.1上,如何在ShowAsync调用后以编程方式关闭MessageDialog 我尝试调用IAsyncInfo.Close(),它只是抛出一个InvalidOperationException“请求了非法状态更改” 我已尝试调用IAsyncInfo.Cancel()。对话框保持可见,这是唯一的结果——在我点击“关闭”按钮后,TaskCanceledException被封送到等待的例程 更新:确切的行为取决于调用的顺序 如果在等待任务之前调用了IAsyncOpera

在Windows Phone 8.1上,如何在ShowAsync调用后以编程方式关闭MessageDialog

我尝试调用IAsyncInfo.Close(),它只是抛出一个InvalidOperationException“请求了非法状态更改”

我已尝试调用IAsyncInfo.Cancel()。对话框保持可见,这是唯一的结果——在我点击“关闭”按钮后,TaskCanceledException被封送到等待的例程

更新:确切的行为取决于调用的顺序

  • 如果在
    等待任务之前调用了
    IAsyncOperation.Cancel()
    ,wait关键字会立即抛出TaskCancelledException。但是,对话框保持可见
  • 如果
    等待任务IAsyncOperation.Cancel()
    之前调用code>,对话框保持可见,但与#1不同,
    wait
    继续等待点击按钮。只有这样才会引发TaskCanceledException
    顺便说一句,我的场景是#2:在某个例程已经在等待完成之后,我需要能够关闭消息对话框。

    在RT中就是这样做的。 保存该ShowAsync任务,以后可以取消该任务

        private IAsyncOperation<IUICommand> dialogTask;
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageDialog dlg = new MessageDialog("This will close after 5 seconds");
            try
            {
                dialogTask = dlg.ShowAsync();
            }
            catch (TaskCanceledException)
            {
                //this was cancelled
            }
    
            DispatcherTimer dt = new DispatcherTimer();
            dt.Interval = TimeSpan.FromSeconds(5);
            dt.Tick += dt_Tick;
            dt.Start();
        }
    
        void dt_Tick(object sender, object e)
        {
            (sender as DispatcherTimer).Stop();
            dialogTask.Cancel();
        }
    
    专用IAsyncOperation对话框任务;
    私有无效按钮\u单击(对象发送者,路由目标e)
    {
    MessageDialog dlg=新建MessageDialog(“这将在5秒后关闭”);
    尝试
    {
    dialogTask=dlg.ShowAsync();
    }
    捕获(TaskCanceledException)
    {
    //取消了
    }
    Dispatchermer dt=新Dispatchermer();
    dt.间隔=从秒开始的时间间隔(5);
    dt.Tick+=dt_Tick;
    dt.Start();
    }
    无效dt_勾选(对象发送方,对象e)
    {
    (发送方作为分派者)。停止();
    dialogTask.Cancel();
    }
    
    请注意,ShowAsync()不是等待的。而是保存到可以取消的任务中。
    可悲的是,我在WP上试过这个,但没有成功

    因此,首先,这不是
    MessageDialog
    的预期用途,因此可能不受支持。您可以尝试手动调用为按钮添加到MessageDialog的UICommands,但这可能只是调用委托方法。如果您正在查找不需要用户交互的消息弹出窗口(如“等待xxx…”),则您没有在查找
    MessageDialog
    。您需要创建一个
    弹出窗口
    ,绘制一些内容,然后在完成后关闭
    弹出窗口
    。如果愿意,您可以将其样式设置为类似于
    MessageDialog
    。它可能不是预期用途,但在Windows应用商店WinRT应用程序中是可能的,因此,一个明显的问题是,为什么不能在Windows Phone WinRT应用程序中使用相同的代码。因为Windows Phone
    MessageDialog
    类很可能是Windows Phone Silverlight
    MessageBox
    类之上的互操作,以便实现基本用例的对等。在给定的时间内,在Windows Phone上重新创建整个WinRT库将是一项令人难以置信的任务,特别是有这么多代码已经实现,并且工作正常,达到了预期目的。制作一个自定义对话框非常简单,而且有大量的指南,所以你只需复制粘贴它们就可以了。我认为按“上一步”按钮应该可以关闭对话框。也许有一种方法可以通过编程实现这一点?但即使这确实奏效,我也不认为这是一个好的解决方案。也许有更好的办法。不,不行。您的代码不工作-请查看更新。您是否看到它在普通Windows或Windows Phone 8.1上工作?请参阅编辑中的新代码。我刚刚验证了此代码将关闭对话框。感谢您的帮助-但是,我需要一个适用于Windows Phone 8.1平台的工作解决方案。