3

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

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

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

4

4 回答 4

4

使您的自定义消息框成为一个表单。然后你可以调用customMessageBoxFormInstance.ShowDialog().. 它块与消息框完全相同。

这就是你要做的:

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

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

它将完全按照您的预期阻止MessageBox..

于 2013-05-31T02:48:24.647 回答
1

这是我所做的:

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

显示模态对话框时,将其放在 DialogOverlay 中,使覆盖层可见并禁用 ViewContainer 网格。这可以防止用户单击/切换到常规 UI。

当对话框关闭时,您应该隐藏overaly 并启用ViewContainer。

于 2013-05-31T06:05:36.597 回答
1

在单击按钮之前,您的自定义 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;
于 2013-05-31T02:43:23.213 回答
0

我使用带有 MVVM 的DialogService - 您可以为您的 CustomMessagebox 实现它。

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

... do anything with the dialog result...
于 2013-05-31T05:38:49.767 回答