像MessageBox或Dialog一样暂停执行



我正在创建一个显示一些警报的应用程序。对话框。展示它是可以的,但它对这个项目来说是丑陋的。这是一个类似Metro的应用程序,所以我们创建了一个类似Metro的MessageBox。

我们的自定义MessageBox是一个网格,当我们需要它时改变它的可见性。问题是,一个真正的MessageBox,停止执行,直到用户点击它的"ok"。

那么,我如何模拟这个行为呢?

将您的自定义消息框设置为窗体。然后可以调用customMessageBoxFormInstance.ShowDialog() ..它的阻塞与消息框的阻塞完全相同。

你应该这样做:

    创建一个类似于自定义MessageBox的表单。也许你可以把你的网格移到里面。
  • 在上面放一个按钮,它的DialogResult属性设置为OK
  • 在你想要提醒显示的地方使用:

    if (customMessageBoxInstance.ShowDialog() == DialogResult.OK) {
        // they clicked okay..
    }
    

它将完全像您期望的MessageBox那样阻塞。

您的自定义Show需要阻塞,直到按钮被单击,所以这个伪代码应该可以工作,尽管可能存在更好的解决方案。理想情况下,MessageBox的UI将运行在一个单独的线程上,但是Show将从主线程调用。

void Show()
{
   // set MessageBox visible
   ...
   // Wait until ok is pressed
   while(!complete){
       Thread.sleep(100);
   };
   complete = false;
   return;
}
// onClick handler for the OK button
void onClick()
{
   complete = true;
   // set message box invisible
}
private bool complete;

我是这样做的:

<Grid>
   <Grid x:Name="DialogOverlay">
   </Grid>
   <Grid x:Name="ViewContainer">
   <Grid>
</Grid>

当显示一个模态对话框,把它放在对话框,使覆盖可见,并禁用ViewContainer网格。这可以防止用户点击/tab键进入常规UI。

当对话框关闭时,你应该隐藏整体并启用ViewContainer

我使用一个带有MVVM的DialogService -你可以为你的CustomMessagebox实现这个。

var result = this.customMessageboxDialogService.ShowDialog("Dialogwindow title goes here", dialogwindowVM);
... do anything with the dialog result...

最新更新