如何在 WPF 中获取 HTML 内容以与其包含的 WebBrowser 控件一起缩放?
How do I get HTML content to scale along with its containing WebBrowser control in WPF?
如果我缩放 WebBrowser 控件(例如使用 Viewbox),它的内容不会随之缩放。这是一个示例:
<Viewbox>
<StackPanel Background="LightBlue">
<Label Content="XAML xaml"/>
<WebBrowser Source="C:\MyPath\Test.html" />
</StackPanel>
</Viewbox>
我有一个 WPF 应用程序可以加载和显示数百个本地 HTML 文件。但是,HTML 在 3840x2160 显示器上显得非常小,因为我的 Viewbox 无法像拉伸其他内容那样拉伸 HTML 内容。但是,我注意到我可以使用触摸手势或鼠标滚轮来缩放 WebBrowser 内容。
解决这个问题的最佳方法是什么?我可以想到几种探索途径。
- 以某种方式获取 WebBrowser 内容以随控件缩放。
- 以编程方式缩放 WebBrowser 文档以匹配 Viewbox 缩放比例。
- 寻找另一种在 WPF 中显示 HTML 内容的方法。
- 将 HTML 转换为 XAML。
微软做了一个suggestion that seems to be related to this issue and I tried implementing it as described in this answer on another question:
但这对我来说真的没有意义。它似乎与禁用上下文菜单有关,而不是缩放 HTML.
我使用了一种缩放方法,然后确保滚动条位于顶部。它需要一些不寻常的参考资料:用于缩放的 Microsoft Internet 控件和用于滚动的 Microsoft.mshtml。
public static void SetZoom(this System.Windows.Controls.WebBrowser wb, int zoom)
{
try
{
FieldInfo webBrowserInfo = wb.GetType().GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic);
object comWebBrowser = null;
object zoomPercent = zoom;
if (webBrowserInfo != null)
comWebBrowser = webBrowserInfo.GetValue(wb);
if (comWebBrowser != null)
{
InternetExplorer ie = (InternetExplorer)comWebBrowser;
ie.ExecWB(OLECMDID.OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref zoomPercent, IntPtr.Zero);
if (wb.Document is mshtml.HTMLDocument htmlDoc)
{
htmlDoc.parentWindow.scrollTo(0, 0);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
如果我缩放 WebBrowser 控件(例如使用 Viewbox),它的内容不会随之缩放。这是一个示例:
<Viewbox>
<StackPanel Background="LightBlue">
<Label Content="XAML xaml"/>
<WebBrowser Source="C:\MyPath\Test.html" />
</StackPanel>
</Viewbox>
我有一个 WPF 应用程序可以加载和显示数百个本地 HTML 文件。但是,HTML 在 3840x2160 显示器上显得非常小,因为我的 Viewbox 无法像拉伸其他内容那样拉伸 HTML 内容。但是,我注意到我可以使用触摸手势或鼠标滚轮来缩放 WebBrowser 内容。
解决这个问题的最佳方法是什么?我可以想到几种探索途径。
- 以某种方式获取 WebBrowser 内容以随控件缩放。
- 以编程方式缩放 WebBrowser 文档以匹配 Viewbox 缩放比例。
- 寻找另一种在 WPF 中显示 HTML 内容的方法。
- 将 HTML 转换为 XAML。
微软做了一个suggestion that seems to be related to this issue and I tried implementing it as described in this answer on another question:
但这对我来说真的没有意义。它似乎与禁用上下文菜单有关,而不是缩放 HTML.
我使用了一种缩放方法,然后确保滚动条位于顶部。它需要一些不寻常的参考资料:用于缩放的 Microsoft Internet 控件和用于滚动的 Microsoft.mshtml。
public static void SetZoom(this System.Windows.Controls.WebBrowser wb, int zoom)
{
try
{
FieldInfo webBrowserInfo = wb.GetType().GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic);
object comWebBrowser = null;
object zoomPercent = zoom;
if (webBrowserInfo != null)
comWebBrowser = webBrowserInfo.GetValue(wb);
if (comWebBrowser != null)
{
InternetExplorer ie = (InternetExplorer)comWebBrowser;
ie.ExecWB(OLECMDID.OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref zoomPercent, IntPtr.Zero);
if (wb.Document is mshtml.HTMLDocument htmlDoc)
{
htmlDoc.parentWindow.scrollTo(0, 0);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}