像MessageBox或Dialog一样暂停执行

时间:2013-05-31 02:27:55

标签: c# wpf mvvm

我正在创建一个显示一些警报的应用程序。 使用MessageBox.Show它可以,但它对这个项目很难看。它是一个类似Metro的应用程序,因此我们创建了类似Metro的MessageBox。

我们的自定义MessageBox是一个网格,可以在需要时更改其可见性。 问题是真正的MessageBox会阻止用户点击“确定”的执行工具。

那么,我怎样才能模拟这种行为?

4 个答案:

答案 0 :(得分:4)

将自定义消息框设为表单。然后你可以调用customMessageBoxFormInstance.ShowDialog() ..它阻止与消息框完全相同。

这就是你要做的事情:

  • 创建一个类似于自定义MessageBox的表单。也许你可以将你的网格移动到它里面。
  • 在其上放置一个按钮,其DialogResult属性设置为OK
  • 在您希望显示警报的任何地方使用此选项:

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

它会完全阻止您MessageBox做的事情。

答案 1 :(得分:1)

您的自定义显示需要阻止,直到单击该按钮,因此该伪代码应该有效,但可能存在更好的解决方案。 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;

答案 2 :(得分:1)

这就是我所做的:

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

显示模式对话框时,将其放在DialogOverlay中,使叠加层可见并禁用ViewContainer网格。这可以防止用户单击/跳转到常规UI。

当对话框关闭时,你应该隐藏过多的并启用ViewContainer。

答案 3 :(得分:0)

我在MVVM中使用DialogService - 您可以为CustomMessagebox实现此功能。

var result = this.customMessageboxDialogService.ShowDialog("Dialogwindow title goes here", dialogwindowVM);

... do anything with the dialog result...