WPF:弹出一个页面模态窗口的最佳方式?

WPF:弹出一个页面模态窗口的最佳方式?,wpf,popup,Wpf,Popup,我正在使用导航样式页面而不是windows构建WPF应用程序。 我想在一个页面内显示一个窗口,这个窗口必须是该页面的模态窗口,但允许用户转到其他页面,并在模态窗口处于相同状态时返回到同一页面 我尝试过使用WPF弹出控件,但问题是每次您离开页面时,该控件都会隐藏。我想我可以编写代码来再次显示它,但是没有正确的方式 在WPF中执行此操作的最佳方法是什么?Windows不希望您这样做-这不是WPF的事情。使用覆盖面板并使用visible或zorder属性 有一个很好的讨论。您可以创建一个弹出类,该类使

我正在使用导航样式页面而不是windows构建WPF应用程序。 我想在一个页面内显示一个窗口,这个窗口必须是该页面的模态窗口,但允许用户转到其他页面,并在模态窗口处于相同状态时返回到同一页面

我尝试过使用WPF弹出控件,但问题是每次您离开页面时,该控件都会隐藏。我想我可以编写代码来再次显示它,但是没有正确的方式


在WPF中执行此操作的最佳方法是什么?

Windows不希望您这样做-这不是WPF的事情。使用覆盖面板并使用visible或zorder属性


有一个很好的讨论。

您可以创建一个弹出类,该类使用装饰层将自身置于其他所有内容之上

为弹出窗口创建一个基类,该类具有一个名为IsOpen的属性,当该属性发生更改时,将控件可见性设置为适当的值

要停止单击弹出窗口下方的控件,可以使弹出窗口具有页面的完整大小。除了弹出窗口所在的实际中间位置外,您将看到它几乎是透明的。如果您希望它对于弹出窗口是完全透明的execpt,您需要覆盖弹出窗口上的HitTestCore

大概是这样的:

protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
    // We want this control to behaive as a single rectangle and we don't much care
    // whether or it has a solid background.  So we override this method so we can have    // mouse over info for the entire panel regardless of background.

    // run the base hit test first, because if it finds something we don't want to overrule it.
    HitTestResult result = base.HitTestCore(hitTestParameters);


    // If we didn't get a hit generate a new hit test result, because HitTestCore is never called unless
    // the mouse is over the controls bounding rectangle.
    if (result == null)
        result = new PointHitTestResult(this, hitTestParameters.HitPoint);

    return result;
}
我希望这能为您指明正确的方向。

这可能会对您有所帮助。 我创建了一些其他用户要求的示例代码。我已将此添加到博客帖子中


希望这有帮助

为什么不使用嵌套的消息泵来创建模式控件


没什么帮助……我将不得不实施各种各样的工作,比如管理按键、点击等。Mac和其他平台支持更细粒度的模态范围,但不支持windows。我知道这是可探索的选项,但正在寻找已经探索过这些选项并得出结论的人。无论如何谢谢你!这样做的目的是只阻塞UI的一部分(本例中的页面),让应用程序的其他部分继续工作。不阻止整个应用程序。迪恩,你来统治。你的正是我想要的,一个真正的阻塞模式对话框。非常感谢。伟大的工作起来很有魅力!可能重复的