WPF中的自定义模态窗口?

时间:2010-03-27 16:51:32

标签: wpf window modal-dialog doevents

我有一个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是一个用户控件,用于托管另一个带有动画和其他支持的元素。

1 个答案:

答案 0 :(得分:2)

我建议重新考虑这个设计。

在某些情况下使用“DoEvents”可能会导致一些非常奇怪的行为,因为您在尝试同时阻止代码时允许代码运行。

您可以考虑使用带有ShowDialog的窗口,而不是使用Popup,只需适当地设置样式。这将是实现模态行为的“标准”方式,WPF允许您将窗口样式设置为非常容易看起来像弹出窗口...