`
leeqoo
  • 浏览: 123894 次
社区版块
存档分类
最新评论

C#Winform中WebBrowser控件的特性和详细调用方法

 
阅读更多

WebBrowser控件简介

WebBrowser控件由来以久,是一个ActiveX控件。以前可以通过COM引用并使用。但在.Net Framework 2.0以后,提供了WebBrowser控件的托管包装。托管包装使得在Windows窗体客户端中显示网页更为简便。
使用WebBrowser控件,可以模仿IE的功能进行Web访问,但不仅仅局限于此,还可以通过禁用默认的IE功能,从而将该控件用作简单的HTML文档查看器,甚至可以浏览office各种格式文档。
此外,WebBrowser支持DOM和文本两种方式修改其承载的内容。这一点意味着没有必要再把修改的HTML保存到临时文件,而是直接在内容中实现修改并显示,提高性能并节省临时文件资源消耗。
总而言之,我们可以通过种种方法,到达将Web控件和Windows窗体控件无缝地整合到一个应用程序中的目的。
利用WebBrowser浏览网页
浏览网页是WebBrowser的老本行,托管包装后的WebBrowser更加简便易用。主要几个方法如下:
Navigate(): 导航页面。与以前版本不同,可以只给定一个参数即可,即URI。
GoBack() / GoForward() / GoHome(): 向后/向前/回首页。
Stop():Refresh(): 停止加载/刷新
以上几个主要方法是用于导航各个页面用的,但它们并不是永远生效。这些方法是否生效,取决于AllowNavigation属性,默认为true,允许导航。
Print():用于打印。

(1)WebBrowser中的Html文档模型
我们可以通过DOM或文本的形式返回当前WebBrowser中的HTML文档:
Document: DOM(文档对象模型)形式的对当前网页的HTML描述。
DocumentText: 文本形式的对当前网页的HTML描述。
DocumentStream: 流形式的HTML描述。
关于文本形式的没有什么好说的,它是最直接的HTML描述,但是难于动态修改,而相比之下DOM形式的HTML描述则灵活的多,可以任意添加、修改、删除任意节点。DOM对象模型主要元素有HtmlDocument, HtmlElement, HtmlNode, HtmlText等等,在此不再啰嗦了。

(2)WebBrowser与IE
默认情况下,WebBrowser控件功能于IE极其相似,提供基本功能。如:可以通过GoHome(),GoBack(),GoFoward(),Stop(),Refresh()来实现IE工具栏中的主页、向后、向前、停止、刷新;通过Navigate()来实现IE中的地址栏;通过设置IsWebBrowserContextMenuEnabled = true来实现IE右键菜单;通过设置WebBrowserShortcutsEnabled = true来实现IE的快捷键等等。
同样在某些特殊需要下,我们可能不希望WebBrowser的行为与IE一样,比如我们只是希望WebBrowser作为一个Html的显示器,在这种情况下可把AllowNavigate设置成false来阻止WebBrowser的导航功能;把IsWebBrowserContextMenuEnabled和WebBrowserShortcutsEnabled设置为false来阻止右键菜单和快捷键等等。从而阻止了WebBrowser的一些IE特性。

(3)WebBrowser中的脚本错误处理
当IE浏览器遇到时脚本错误,左下角会出现一个黄色图标,点击可以查看脚本错误的详细信息,并不会有弹出的错误信息框。但是WebBrowser控件则没有这么聪明,它会弹出错误信息框,使得程序显的很不友好,而且会让一些自动执行的程序暂停。虽然WebBrowser提供了ScriptErrorsSuppressed属性,经过尝试,结果是令人遗憾的,通过设置该属性可以解决部分问题,但不能彻底解决。在此探讨两种解决方案:一是通过截获WebBrowser.Document.Window.Error事件,并阻止WebBrowser继续处理错误来解决。如下:
//注册捕获控件的错误的处理事件

this.WebBrowser.Document.Window.Error +=
new HtmlElementErrorEventHandler(Window_Error);
//对错误进行处理
void Window_Error(object sender, HtmlElementErrorEventArgs e)
{
e.Handled = true; // 阻止其他地方继续处理
}上面的方法可以解决大部分问题,但对于多个框架嵌套等等的情形还是不能很好的解决,于是只能自己动手封装一个MyWebBrowser了,然后用我们自己的MyWebBrowser来替代WebBrowser。如下:
public class MyWebBrowser : System.Windows.Forms.WebBrowser
{
private SHDocVw.IWebBrowser2 Iwb2;
protected override void AttachInterfaces(object nativeActiveXObject)
{
Iwb2 = (SHDocVw.IWebBrowser2) nativeActiveXObject;
Iwb2.Silent = true;
base.AttachInterfaces(nativeActiveXObject);
}
protected override void DetachInterfaces()
{
Iwb2 = null;
base.DetachInterfaces();
}
}这种方法能能很好的解决问题,其实使用过非托管WebBrowser的朋友肯定看出来了,实际上是通过引用SHDocVw绕过托管代码,直接SHDocVw.IWebBrowser2.Silent = true,最原始的也是最有效的。
利用WebBrowser访问Office文件

刚刚说过浏览网页是WebBrowser的老本行,那么除了本行外,其实他还可以搞点兼职。我们知道,在.Net窗体中是不提供嵌入Office文档OLE控件的,如果希望嵌Office文档的话,一个可能的解决方案就是使用WebBrowser控件。
其实在IE中就可以嵌入Office文档,所以WebBrowser具有此功力也很正常,但它带来的效果确实不错。操作也很简单:
this.webBrowser1.Navigate(strFileName);
只此一句,WebBrowser就会以嵌入的形式打开Office文档(Word, Excel, PowerPoint,...)了,效果如下图:




使用 WebBrowser 控件时的注意事项

1、在NET 2.0下的Webbrowser控件是对Webbrowser COM组件的不完全封装。所以,在简便的同时也会出现这样或那样的问题。简便也是有代价的。

2、WebBrowser控件异步浏览到文档。在调用Navigate()时,该调用会在文档完全加载之前将控制权返回给应用程序。如果打算为所包含的文档实现自动操作,则必须在DocumentCompleted事件在文档完成加载后发出通知。或是通过IsBusy来判断当前WebBrowser是否正忙于加载其他文档。
然而,通过实践,问题却不是这么简单。一般情况下,当ReadyState属性变成READYSTATE_COMPLETE时,Webbrowser控件会通过触发DocumentCompleted事件来指示网页加载完毕。但当加载的网页包含frame时,可能会多次触发该事件,所以不能简单地通过它来判断网页加载完毕。并非每个frame都对应了一个DocumentCompleted事件,只有触发了DownloadBegin事件的frame才会有相应的DocumentCompleted事件。另外,最外层的frame总是最后触发DocumentCompleted事件。那么怎么准确的判断页面加载完毕了呢,以下为一方案:
int counter = 0 ; // 计数器
private void webBrowser_Navigated(object sender,
WebBrowserNavigatedEventArgs e){
counter ++ ;
}
private void webBrowser_DocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e){
counter -- ;
if (counter == 0){
// 加载完毕
}
}
3、在一个项目中有多个WebBrowser控件并且每个控件都加载相同类型的Office文档(全都是Word或全都是Excel)时,会出现多种问题。最常见的问题发生在Office命令栏上(命令栏会被禁用)。如果在同一个窗体上有两个WebBrowser控件,且两个控件都加载Word文档,那么只有一组工具栏会是活动的,另外一个则被禁用,无法使用。所以,建议一个项目只使用一个控件,并且一次只浏览到一个文档。

4、要清除WebBrowser控件中的当前内容,使用下面的代码浏览到默认空白页:

详细出处参考:http://www.ityoudao.com/Web/Csharp_590_1779.html
分享到:
评论

相关推荐

    C#中WebBrowser控件的简单调用

    4,双击按钮添加代码,调用WebBrowser控件的Navigate方法实现显示不同网页 private void button1_Click(object sender, EventArgs e) { webBrowser1.Navigate("网址"); } 5,实现点链接而不弹窗,右击...

    c# winform webbrowser页面中js调用winform类方法

    通过以上步骤,你就能实现JavaScript在WinForm的`WebBrowser`控件中调用C#类方法的功能。这个"jsInWebBrowserCallCSharpMethod"示例应该包含具体的代码实现,你可以参考其结构和细节,根据自己的需求进行调整。记住...

    c#winform中完美代替WebBrowser最新的控件geckofx33支持flash例子demo

    c#winform中完美代替WebBrowser最新的控件geckofx33支持flash例子demo 经历了webbrowser 内存溢出 排版错误等各种问题 终于找到了一个解脱模式,就是使用firefox内核的现阶段代替webbrowser最好的控件了。 例子中...

    C# 从内存中获取webbrowser控件截图,可以后台或者隐藏窗体截图

    这可以通过重写OnPaint方法来实现,或者直接调用WebBrowser控件的`DrawToBitmap`方法。 ```csharp Bitmap bitmap = new Bitmap(webBrowser1.Width, webBrowser1.Height); webBrowser1.DrawToBitmap(bitmap, new ...

    c# winform 中怎样来调用B/S中的JavaScript的方法

    总结来说,C# WinForm调用B/S中的JavaScript方法主要是通过WebBrowser控件加载页面并调用其中的JavaScript函数,而JavaScript调用WinForm的方法则需要利用`window.external`对象和COM互操作性。这样的交互方式虽然...

    C# winfrom webbrowser控件 内嵌火狐内核内核

    标题中的"C# WinFrom WebBrowser控件内嵌火狐内核内核",意味着我们将探讨如何在C#的WinForm应用中替换默认的`WebBrowser`控件,使其能够利用Mozilla Firefox的Gecko内核进行网页渲染。这通常涉及到使用第三方库,如...

    c# winform 里调用javascrip的方法

    本文详细介绍了如何在C# WinForm应用程序中通过WebBrowser控件调用JavaScript函数的过程。这种方法不仅能够增强应用程序的交互性,还能实现更加复杂的功能,如动态更新HTML内容、处理用户输入等。开发者可以根据实际...

    C#实现Winform中打开网页页面的方法

    本文将详细介绍如何在C#的Winform应用程序中打开并控制网页页面。 首先,最简单直接的方法是使用`System.Diagnostics.Process.Start()`方法启动默认的浏览器来打开指定的网页。以下是一个简单的示例: ```csharp ...

    .NET的WebBrowser控件的的介绍及用法(方法、属性和事件)

    - 考虑性能问题,不要在循环或其他长时间运行的任务中频繁调用与页面相关的属性和方法。 - 针对跨域安全策略,可能需要设置WebBrowser控件的安全区域和信任级别。 通过深入理解和熟练使用WebBrowser控件,开发者...

    WinForm程序中webBrowser使用谷歌内核

    3. **在WinForm中添加控件**:在你的窗体类(如`MainForm`)中,添加一个`ChromiumWebBrowser`控件。在设计视图或代码中创建实例,并将其放置在适当的位置: ```csharp using CefSharp.WinForms; public ...

    C#WebBrowser页面与Winform交互技巧

    在开发基于Windows平台的应用程序时,经常需要使用WebBrowser控件来在Winform应用程序中嵌入网页内容,并且可能需要与这些网页内容进行交云。本文将详细介绍如何在C#中实现WebBrowser页面与Winform的交互。 #### ...

    C# winfrom窗体显示百度地图

    1. 在Visual Studio 2015中打开你的C# WinForm项目,然后在工具箱中找到并拖拽WebBrowser控件至你的窗体上。 2. 设置WebBrowser控件的属性,如Dock属性通常设置为Fill,使得控件充满整个窗体。 3. 编写代码来加载...

    c# winform 自动登录 百度账户 源代码

    首先,我们需要理解C# WinForm是一个桌面应用程序开发框架,而WebBrowser控件是.NET Framework提供的一种能够嵌入到Windows应用程序中的浏览器组件,它允许应用程序在窗口内显示网页内容并执行与浏览器相关的操作。...

    C#生成Html并在WebBrowser中显示

    在C#编程中,生成HTML并将其在WebBrowser控件中显示是一种常见的需求,尤其在开发桌面应用程序时。WebBrowser控件允许我们嵌入一个基于IE内核的浏览器引擎,从而在应用程序内部浏览网页内容。这个过程对于创建交互式...

    webkit与C#winform相互调用

    反之,JavaScript可以通过调用WebBrowser控件的`InvokeScript`方法与C#进行通信。例如,C#中可以调用`webBrowser1.Document.InvokeScript("myJSFunction", new object[] { "参数" });`来执行JavaScript函数。 2. **...

    C#使用webBrowser控件获取URL下载图片

    通过C#网络编程的webBrowser获取网页中的url并简单的尝试下载网页中的图片,主要是为以后网络开发的基础学习.其中主要的通过应用程序结合网页知识、正则表达式实现浏览、获取url、下载图片三个功能.而且很清晰的解析...

    浅谈C#下winform和JS的互相调用和传参(webbrowser)

    接下来,对于JavaScript调用WinForms中的C#函数,我们需要让WebBrowser控件能够访问WinForms中的对象。这通常通过设置WebBrowser控件的ObjectForScripting属性来实现。代码示例中的代码设置ObjectForScripting为当前...

    c# winform 自动隐藏的panel

    jQuery是JavaScript库,虽然主要用于Web开发,但其强大的DOM操作和事件处理功能也可以在WinForm中通过WebBrowser控件间接应用。例如,可以通过嵌入HTML和jQuery代码,为Panel添加更丰富的交互效果。 测试是保证软件...

    c# winform与html交互

    5. 在C#代码中编写事件处理程序,调用`InvokeScript`方法来触发HTML中的JavaScript函数。 6. 可以设置一个按钮或其他控件,当用户点击时,调用`InvokeScript`以实现交互。 **五、注意事项** - 要确保HTML文件与...

    winform窗体中嵌入网页(DHTML代码和winfrom应用程序交互)

    在实现网页和 Winform 应用程序的交互时,需要在 Winform 窗体类中实现公共属性和方法,以便网页脚本代码可以调用这些方法。例如,可以实现一个公共方法来显示消息框,或者实现一个公共属性来提供一些业务逻辑。 ...

Global site tag (gtag.js) - Google Analytics