1. 程式人生 > >webbrowser 控件實現WinForm與WebForm交互

webbrowser 控件實現WinForm與WebForm交互

form all run nbsp .com gof load btn his

WebBrowser 控件可以讓你裝載Windows Form 應用程序中的 Web 網頁和其它采用瀏覽器的文件。可以使用webbrowser 控件將現有的web框架控制項加入至 Windows Form 客戶端應用程序。
還是直接看代碼吧。

WebBrowser 控制項 提供的屬性、方法和事件,可用來實現 Internet Explorer 的控制項
webBrowser1.Navigate("www.cnblogs.com"); //將指定位置處的文件載入至 WebBrowser
webBrowser1.GoBack();//上一頁
webBrowser1.GoForward();//下一頁
webBrowser1.Refresh();//刷新
webBrowser1.GoHome();//主頁
這裏提供了WebBrowser常用的方法,



上面的代碼是將 我們園子的主頁載入到WebBrowser控件中。如果我們想要在應用程式中產生自己的網頁內容,可以設定DocumentText屬性。也可以通過Document屬性來處理目前的網頁內容。如下代碼是使用 DocumentText 屬性,顯示網頁內容。並用Document屬性來處理所顯示的網頁。

1技術分享圖片private void btnDocumentText_Click(object sender, EventArgs e)
2技術分享圖片
{
3技術分享圖片 string szHtml = @"
4技術分享圖片<HTML>
5技術分享圖片<HEAD>
6技術分享圖片<TITLE> DocumentText </TITLE>
7技術分享圖片</HEAD>
8技術分享圖片
9技術分享圖片<BODY>
10技術分享圖片 Please enter your name:<br/>
11技術分享圖片 <input type=‘text‘ name=‘Name‘/><br/>
12技術分享圖片 <a href=‘http://www.microsoft.com‘ >Send input to method of Form class</a>
13技術分享圖片

14技術分享圖片</BODY>
15技術分享圖片</HTML>";
16技術分享圖片
17技術分享圖片 webBrowser1.DocumentText = szHtml;
18技術分享圖片
19技術分享圖片 }
20技術分享圖片
21技術分享圖片 private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
22技術分享圖片 {
23技術分享圖片 System.Windows.Forms.HtmlDocument document = this.webBrowser1.Document;
24技術分享圖片
25技術分享圖片 if (document != null && document.All["Name"] != null && String.IsNullOrEmpty(document.All["Name"].GetAttribute("value")))
26技術分享圖片 {
27技術分享圖片 e.Cancel = true;
28技術分享圖片 System.Windows.Forms.MessageBox.Show("You must enter your name before you can navigate to " + e.Url.ToString());
29技術分享圖片 }
30技術分享圖片
31技術分享圖片 }


既然我們可以通過DocumentText生成自己的網頁,那麽能不能象使用IE那樣操作這個網頁呢?,答案是肯定的,完全可以像操作Web程序那樣操作WebBrowser 控制項。比如我們可以加入腳本,CSS。當然,如果你熟悉 HTML 物件對象模型 (DOM),也可以透過 Document 屬性來處理目前的Web網頁內容。下面的例子加入了JavaScript腳本來控制網頁。如果要在Winfrom程序中寫大量的Javascriot代碼,而且這些代碼最終要轉換成String型載入到Webbrowser 那將是很痛苦的事情,不過沒有關系,我們可以創建一個js文件,放入資源中,用的時候只需從資源中載入即可。這裏我創建一個名為 ClientScript.js 的文件。

1技術分享圖片<script language = "javascript">
2技術分享圖片function ClickEvent(name)
3技術分享圖片{
4技術分享圖片 alert("Hello: " +name);
5技術分享圖片}
6技術分享圖片
7技術分享圖片function KeyDown()
8技術分享圖片{
9技術分享圖片 if (event.keyCode==116)
10技術分享圖片 {
11技術分享圖片 event.keyCode=0;
12技術分享圖片 event.returnValue=false;
13技術分享圖片 }
14技術分享圖片
15技術分享圖片 return false;
16技術分享圖片}

技術分享圖片string szClientScript = ManagedWebBrowser.Properties.Resources.ResourceManager.GetString("ClientScript");
技術分享圖片
技術分享圖片 string szWebBrowserText = "<html>" +
技術分享圖片 "<head>" +
技術分享圖片 "<title></title>"+
技術分享圖片 szClientScript +
技術分享圖片 "</head>" +
技術分享圖片 "<body onkeydown=\"KeyDown()\" oncontextmenu=\"event.returnValue=false\">"+
技術分享圖片
技術分享圖片 "Please enter your name:<br/>"+
技術分享圖片 "<input type=‘text‘ name=‘Name‘/><br/>"+
技術分享圖片 "<font onclick = ‘ClickEvent(Name.value)‘>Click Here</font>"+
技術分享圖片 "</body></html>";
技術分享圖片
技術分享圖片
技術分享圖片 webBrowser1.DocumentText = szWebBrowserText;

WebBrowser 是 System.Windows.Forms 下的控制項,也就是意味著它是用在WimForm程序下,那麽WebWrower所載入的Web頁面如何實現在WinForm程序下處理呢。例如上例中的 "<font onclick = ‘ClickEvent(Name.value)‘>Click Here</font>" 。這裏的Click事件是通過腳本處理的,如何讓這個Click事件在Winform中處理呢?這裏要做一些修改。若要從指令碼存取用戶端應用程式,需要設定ObjectForScripting 屬性。指令碼可以將您指定的物件當做window.external 物件來存取。

使用ObjectForScripting屬性,可啟用 WebBrowser 控制項所裝載之 Web 網頁與包含 WebBrowser 控制項之應用程式間的通訊。
這個屬性可讓您整合動態超文字標記語言 (DHTML) 程式碼與用戶端應用程式程式碼。
指定給這個屬性的物件可讓 Web 網頁指令碼做為 window.external 物件,這個物件是為了存取主應用程式而提供的內建 DOM 物件。

1技術分享圖片 private void btnScriptEvent_Click(object sender, EventArgs e)
2技術分享圖片 {
3技術分享圖片
4技術分享圖片 // This is the handler for loading the script into the Web Browser control and allowing us to interact
5技術分享圖片 // between the script in the Browser control and this form class
6技術分享圖片
7技術分享圖片
8技術分享圖片 // Set the ObjectForScripting property of the Web Browser control to point to this form class
9技術分享圖片 // This will allow us to interact with methods in this form class via the window.external property
10技術分享圖片 webBrowser1.ObjectForScripting = this;
11技術分享圖片
12技術分享圖片 string szWebBrowserText = "<html>" +
13技術分享圖片 "<head>" +
14技術分享圖片 "<title></title>"+
15技術分享圖片 "</head>" +
16技術分享圖片 "<body onkeydown=\"KeyDown()\" oncontextmenu=\"event.returnValue=false\">"+
17技術分享圖片
18技術分享圖片 "Please enter your name:<br/>"+
19技術分享圖片 "<input type=‘text‘ name=‘Name‘/><br/>"+
20技術分享圖片 "<font onClick=‘window.external.ClickEvent(Name.value)‘>Click Here</font>"+
21技術分享圖片 "</body></html>";
22技術分享圖片
23技術分享圖片
24技術分享圖片 webBrowser1.DocumentText = szWebBrowserText;
25技術分享圖片 }
26技術分享圖片 public void ClickEvent(string userName)
27技術分享圖片 {
28技術分享圖片 // Simply echo out the name that the user typed in the input box of the HTML page
29技術分享圖片 if (System.Threading.Thread.CurrentThread.CurrentUICulture.TextInfo.IsRightToLeft == true)
30技術分享圖片 MessageBox.Show("Hello " + userName, "Managed Web Browser Sample", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign | MessageBoxOptions.RtlReading);
31技術分享圖片 else
32技術分享圖片 MessageBox.Show("Hello " + userName, "Managed Web Browser Sample", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
33技術分享圖片
34技術分享圖片 }


這裏的ObjectForScripting 屬性設置為 this。註意:在From1 類的開頭加入了這麽一句[ComVisible(true)], 它在System.Runtime.InteropServices下,預設值為 true,指出 Managed 型別對於 COM 為可見的。

[ComVisible(true)]
public partial class Form1 : System.Windows.Forms.Form

webbrowser 控件實現WinForm與WebForm交互