C# 以编程方式关闭MessageDialog
在Windows Phone 8.1上,如何在ShowAsync调用后以编程方式关闭MessageDialog 我尝试调用IAsyncInfo.Close(),它只是抛出一个InvalidOperationException“请求了非法状态更改” 我已尝试调用IAsyncInfo.Cancel()。对话框保持可见,这是唯一的结果——在我点击“关闭”按钮后,TaskCanceledException被封送到等待的例程 更新:确切的行为取决于调用的顺序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
等待任务之前调用了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 PhoneMessageDialog
类很可能是Windows Phone SilverlightMessageBox
类之上的互操作,以便实现基本用例的对等。在给定的时间内,在Windows Phone上重新创建整个WinRT库将是一项令人难以置信的任务,特别是有这么多代码已经实现,并且工作正常,达到了预期目的。制作一个自定义对话框非常简单,而且有大量的指南,所以你只需复制粘贴它们就可以了。我认为按“上一步”按钮应该可以关闭对话框。也许有一种方法可以通过编程实现这一点?但即使这确实奏效,我也不认为这是一个好的解决方案。也许有更好的办法。不,不行。您的代码不工作-请查看更新。您是否看到它在普通Windows或Windows Phone 8.1上工作?请参阅编辑中的新代码。我刚刚验证了此代码将关闭对话框。感谢您的帮助-但是,我需要一个适用于Windows Phone 8.1平台的工作解决方案。