16

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

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

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

4

4 回答 4

18

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

希望这可以帮助!

于 2009-02-25T00:44:17.163 回答
5

Why not just use nested message pumps to create modal controls

http://www.deanchalk.com/wpf-modal-controls-via-dispatcherframe-nested-message-pumps/

于 2010-11-12T10:46:19.630 回答
3

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

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

要停止单击弹出窗口下方的控件,您可以使弹出窗口占据页面的完整大小。除了弹出窗口的实际中间之外,您将使其大部分透明。如果您希望它对弹出窗口完全透明,则需要覆盖弹出窗口上的 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;
}

我希望这可以为您指明正确的方向。

于 2009-02-25T00:34:27.170 回答
1

Windows 不喜欢你这样做——这不是 WPF 的事情。使用覆盖面板并使用 visible 或 zorder 属性。

维基百科有一个很好的讨论。

于 2009-01-09T18:57:37.217 回答