我正在创建一个显示一些警报的应用程序。使用 MessageBox.Show 可以,但对于这个项目来说很难看。它是一个类似 Metro 的应用程序,因此我们创建了一个类似 Metro 的 MessageBox。
我们的自定义 MessageBox 是一个网格,可以在需要时更改其可见性。问题是一个真正的 MessageBox 会在用户单击其“确定”时停止执行。
那么,我怎样才能模拟这种行为呢?
使您的自定义消息框成为一个表单。然后你可以调用customMessageBoxFormInstance.ShowDialog()
.. 它块与消息框完全相同。
这就是你要做的:
MessageBox
。也许您可以将网格移入其中。DialogResult
属性设置为OK
.在您希望显示警报的任何地方使用它:
if (customMessageBoxInstance.ShowDialog() == DialogResult.OK) {
// they clicked okay..
}
它将完全按照您的预期阻止MessageBox
..
这是我所做的:
<Grid>
<Grid x:Name="DialogOverlay">
</Grid>
<Grid x:Name="ViewContainer">
<Grid>
</Grid>
显示模态对话框时,将其放在 DialogOverlay 中,使覆盖层可见并禁用 ViewContainer 网格。这可以防止用户单击/切换到常规 UI。
当对话框关闭时,您应该隐藏overaly 并启用ViewContainer。
在单击按钮之前,您的自定义 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;
我使用带有 MVVM 的DialogService - 您可以为您的 CustomMessagebox 实现它。
var result = this.customMessageboxDialogService.ShowDialog("Dialogwindow title goes here", dialogwindowVM);
... do anything with the dialog result...