【问题标题】:Custom Modal Window in WPF?WPF中的自定义模式窗口?
【发布时间】: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


【解决方案1】:

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

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

您可以考虑使用带有ShowDialog 的窗口,而不是使用弹出窗口,并适当地设置它的样式。这将是实现模态行为的“标准”方式,WPF 让您可以轻松地为窗口设置样式,使其看起来与弹出窗口完全一样...

【讨论】:

  • 谢谢,效果更好。重新设计的窗口为我提供了我想要的模态行为,并且我仍然可以灵活地获得我想要的视觉效果。这让我摆脱了 ModalSurface 及其相关的 hack 来阻止点击底层 Window。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 2011-03-08
相关资源
最近更新 更多