我正在创建一个显示一些警报的应用程序。对话框。展示它是可以的,但它对这个项目来说是丑陋的。这是一个类似Metro的应用程序,所以我们创建了一个类似Metro的MessageBox。
我们的自定义MessageBox是一个网格,当我们需要它时改变它的可见性。问题是,一个真正的MessageBox,停止执行,直到用户点击它的"ok"。
那么,我如何模拟这个行为呢?
将您的自定义消息框设置为窗体。然后可以调用customMessageBoxFormInstance.ShowDialog()
..它的阻塞与消息框的阻塞完全相同。
你应该这样做:
- 创建一个类似于自定义
- 在上面放一个按钮,它的
DialogResult
属性设置为OK
。 在你想要提醒显示的地方使用:
if (customMessageBoxInstance.ShowDialog() == DialogResult.OK) { // they clicked okay.. }
MessageBox
的表单。也许你可以把你的网格移到里面。它将完全像您期望的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...