有没有办法在 wpf WebBrowser 控件之上呈现 WPF 控件?

Posted

技术标签:

【中文标题】有没有办法在 wpf WebBrowser 控件之上呈现 WPF 控件?【英文标题】:Is there a way to render WPF controls on top of the wpf WebBrowser control? 【发布时间】:2011-04-25 00:09:15 【问题描述】:

我需要在我的应用程序中嵌入一个 WebBrowser 控件,但在其上显示 WPF 内容时遇到问题。应用程序有时会显示用于编辑数据或显示错误的弹出窗口,并且 WebBrowser 被绘制在弹出窗口之上,因为它是一个 WinForms 控件。

我查看here 的替代方案使用 Popup 控件将项目放在 WebBrowser 控件的顶部,但是我对 Popups 的问题是当您切换到另一个应用程序时它们保持打开状态,并且它们不会随着您的应用程序移动用户调整/移动应用程序的大小。

有没有其他方法可以做到这一点?嵌入的网页内容是 aspx 页面,因此不是静态 html

【问题讨论】:

【参考方案1】:

当其他一些控件出现在 Web 浏览器控件前面时,您可以做的解决方法是使 Web 浏览器控件的高度为零。

修复:标准修复是当您触发对它的其他控制时,您可以将 Web 浏览器的高度设置为零,具体取决于您的场景。下面是一个示例实现。

在 MainWindow.Xaml 中包含事件。

Activated="Window_Activated"
Deactivated="Window_Deactivated"

在 Xaml.cs 中通过设置高度来处理场景。

private void Window_Activated(object sender, EventArgs e)

    wb.Height = double.NaN;


private void Window_Deactivated(object sender, EventArgs e)

    wb.Height = 0;

【讨论】:

【参考方案2】:

我已经取得了一些成功的另一种方法是使用剪切区域来在本质上托管在这些 WebBrowser 包装器控件中的 ActiveX 控件中切出洞。如果我有时间,我会写一个我发现的演示并尝试包含一个示例,但我只是想分享一下,以防有人有更多时间研究并可以击败我。

【讨论】:

【参考方案3】:

不幸的是,嵌入式网络浏览器很糟糕。如果您在 WebBrowser 中显示真实、真实、动态的 Web 内容,您必须经历将另一个窗口链接到您托管的 WebBrowser 窗口的痛苦,并自己处理移动/调整大小/等。我还没有看到其他可行的方法。

如果您正在显示静态内容(或来自您可以控制或影响的来源的内容),您可能会考虑在 DocumentViewer 中显示 RTF 文档,而不是 WebBrowser 的棘手空域问题控制。

【讨论】:

很遗憾我的网页内容是动态的 将此标记为答案,因为它最好地解释了问题。我实际上所做的是为 WebBrowser 控件创建一个全局样式,当弹出窗口可见时将它们隐藏起来。如果我需要在弹出窗口打开时使用 Web 内容,我会看到如何实现第二个窗口并处理调整大小/移动问题,但现在这适合我的目的。【参考方案4】:

WPF 4.0 Chromium WebBrowser 项目是内置 WebBrowser 控件的替代方案,可以满足您的需求。

【讨论】:

我已经尝试过了,但似乎无法在我的机器上编译它。【参考方案5】:

解决空域问题的一种方法是创建一个新的无框窗口并将其放置在 webbrowser 控件的顶部。这样做的主要问题是在主窗口移动/调整大小/等时保持正确定位。

【讨论】:

【参考方案6】:

您可以使用 Adorner 来实现这一点。 http://msdn.microsoft.com/en-us/library/ms753340.aspx

【讨论】:

AdornerLayer 似乎仍然呈现在 WinForms 层下方,这是 WPF WebBrowser 控件呈现的位置

以上是关于有没有办法在 wpf WebBrowser 控件之上呈现 WPF 控件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 WPF WebBrowser 控件时如何抑制脚本错误?

WPF使用webbrowser控件时,每次打开都显示“Web浏览器已经限制此文件显示可能访问您的计算机的活动内容“,解决办法

wpf中我想在WebBrowser控件上放置一个Border控件

DELPHI中的webbrowser如何有效防止内存疏漏

WPF中使用WebBrowser

WPF 使用Win32API 让控件置于WebBrowser上方