暂停执行类似于消息框或对话框

3
我正在创建一个显示某些警报的应用程序。 使用MessageBox.Show是可以的,但对于这个项目来说很丑陋。 这是一个类似Metro的应用程序,因此我们创建了一个类似Metro的MessageBox。
我们的自定义MessageBox是一个网格,当需要时改变其可见性。 问题是真正的MessageBox会停止执行,直到用户点击“OK”为止。
那么,我该如何模拟这种行为?

在另一个线程上显示消息框。 - User 12345678
@ByteBlast 为什么要在另一个线程中执行?请给我更多的解释。 - Ricardo Polo Jaramillo
@RicardoPolo 因为 MessageBox.Show 阻塞了当前线程。 - User 12345678
4个回答

4

将您的自定义消息框制作成一个表单。然后,您可以调用customMessageBoxFormInstance.ShowDialog(),它会像消息框一样阻塞。

这是您需要做的:

  • Create a form that resembles your custom MessageBox. Perhaps you can move your grid into it.
  • Put a button on there which has it's DialogResult property set to OK.
  • Use this wherever you want your alert to show up:

    if (customMessageBoxInstance.ShowDialog() == DialogResult.OK) {
        // they clicked okay..
    }
    
它会像你期望的MessageBox一样阻止执行。

我觉得我做不到。我正在使用WPF和MVVM。 - Ricardo Polo Jaramillo
2
你可以在“Window”上使用:http://msdn.microsoft.com/zh-cn/library/system.windows.window.showdialog.aspx - Simon Whitehead

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;

1
这是我所做的内容:
<Grid>
   <Grid x:Name="DialogOverlay">
   </Grid>
   <Grid x:Name="ViewContainer">
   <Grid>
</Grid>

显示模态对话框时,请将其放置在DialogOverlay中,使覆盖层可见并禁用ViewContainer网格。这可以防止用户点击/切换到常规UI。
当对话框关闭时,应隐藏覆盖层并启用ViewContainer。

在完成工作的同时,如果设计需要/允许,它还可以访问应用程序的其他部分,例如允许转到不同的选项卡。 - denis morozov
是的,您可以在任何地方嵌套此结构,以便仅阻止正在更新/等待的UI部分。 - Emond

0

我在MVVM中使用DialogService - 你可以为你的CustomMessagebox实现这个。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接