【发布时间】:2010-03-27 16:51:31
【问题描述】:
我有一个 WPF 应用程序,我想在其中创建一个具有模态行为的自定义弹出窗口。我已经能够使用与“DoEvents”等效的解决方案来破解解决方案,但是有没有更好的方法来做到这一点?这是我目前拥有的:
private void ShowModalHost(FrameworkElement element)
{
//Create new modal host
var host = new ModalHost(element);
//Lock out UI with blur
WindowSurface.Effect = new BlurEffect();
ModalSurface.IsHitTestVisible = true;
//Display control in modal surface
ModalSurface.Children.Add(host);
//Block until ModalHost is done
while (ModalSurface.IsHitTestVisible)
{
DoEvents();
}
}
private void DoEvents()
{
var frame = new DispatcherFrame();
Dispatcher.BeginInvoke(DispatcherPriority.Background,
new DispatcherOperationCallback(ExitFrame), frame);
Dispatcher.PushFrame(frame);
}
private object ExitFrame(object f)
{
((DispatcherFrame)f).Continue = false;
return null;
}
public void CloseModal()
{
//Remove any controls from the modal surface and make UI available again
ModalSurface.Children.Clear();
ModalSurface.IsHitTestVisible = false;
WindowSurface.Effect = null;
}
我的 ModalHost 是一个用户控件,旨在承载具有动画和其他支持的另一个元素。
【问题讨论】:
-
是的,应该这样做。除了,您可能不需要 IsHitTestVisible 循环。
-
循环是造成 ShowModalHost 调用阻塞的原因;否则会在 ModalHost 关闭之前返回到原来的调用上下文。
标签: wpf window modal-dialog doevents