这些天 一直在赶项目,所以也没什么时间写博客。今天抽出一点点空来写个。
由于项目的需要,我测试了下 在桌面软件里面嵌入网页(webbrowser),然后在后台用C#代码操作嵌入的页面,甚至还加上了Ext,结果跑得很顺利,下面一个一个讲:
1、加载本地网页
拖一个form,并放入一个WebBrowser,假设id为webBrowser1。
把网页放到程序运行时的目录里面,并用如下方法找到此网页:
string curDir = Environment.CurrentDirectory+"\\webPage.htm";
当然,也可以不用 Environment.CurrentDirectory,还有其它 的方法获得程序运行时目录,有兴趣去google一下。
然后加载些网页:
webBrowser1.Navigate(curDir);
2、给网页中的按钮添加事件:
<html>
<body>
<input type="button" id="btnTest" value="测试" onclick="alert('OK')"/>
<input type="text" id="txt" />
<br />
<span id="spantxt" style="color:Blue;font-size:large;">
这些天 一直在赶项目,所以也没什么时间写博客。今天抽出一点点空来写个。
由于项目的需要,我测试了下 在桌面软件里面嵌入webbrowser,然后在后台操作嵌入的页面,甚至还加上了Ext,结果跑得很顺利,下面一个一个讲:
1、加载本地网页
拖一个form,并放入一个WebBrowser,假设id为webBrowser1。
把网页放到程序运行时的目录里面,并用如下方法找到此网页:
string curDir = Environment.CurrentDirectory+"\\webPage.htm";
当然,也可以不用 Environment.CurrentDirectory,还有其它 的方法获得程序运行时目录,有兴趣去google一下。
然后加载些网页:
webBrowser1.Navigate(curDir);</span>
</body>
</html>
注意一点:上图中间的两个大按钮“测试”和“打印预览” 都是在form中拖出来的,不是原网页的。由此可以看出,Form里面的内容是可以和加载的网页的内容并存的。
上面的这个网页中,已经有一句js的事件,我们再添加一个事件:
先给中间的那个大的“测试”按钮加上事件,由于它是用C#代码生成的,所以双击就可以生成一个事件:
private void button1_Click(object sender, EventArgs e){}
我们在这事件里面给网页的左上角的那个小“测试”按钮加上事件:
先得到网页的 document元素:
HtmlDocument html = webBrowser1.Document;
再根据id得到那个小按钮:
HtmlElement btnTest = html.All["btnTest"];
再给它添加事件:
if (btnTest != null)
{
//btnClose.Click += new HtmlElementEventHandler(btnClose_Click);
btnTest.AttachEventHandler("onclick", new EventHandler(btnTest_Click2));
MessageBox.Show("-->" + btnTest.GetAttribute("value"));
//如果是input type="submit"的话,可以把onclick换成"onsubmit"
}
代码中,要先判断得到的元素是不是为空,如果不是,就进入下一步:加事件,上面只给出两种方法:
//btnClose.Click += new HtmlElementEventHandler(btnClose_Click);
或者
btnTest.AttachEventHandler("onclick", new EventHandler(btnTest_Click2));
第二种方法比较通用,因为可以用它来触发其它事件,如:form中的submit按钮 可以加上"onsubmit"事件。
用btnTest.GetAttribute("元素属性") 可以得到网页中任一元素的任一属性,代码中 我们得到的是网页中那个输入框的值。
3、用C#执行网页元素的事件或js方法:
这里先讲执行网页元素的事件,后者的话后面会涉及到。
很简单,就一句话:
//触发按钮动作
btnTest.InvokeMember("click");
4、改变网页输入框中的内容:
HtmlElement txt = html.All["txt"];
//html.GetElementById("txt").InnerText = "lingyb"; //GetElementById是万能的,当然也可以用下面这一句代码来实现
txt.InnerText = "lingyb2";
if (txt != null)
{
MessageBox.Show("=1=>" + txt.GetAttribute("value"));
}
5、得到span里面的内容:
HtmlElement span = html.All["spantxt"];
if (span != null)
{
MessageBox.Show("=2=>" + span.GetAttribute("innerHtml"));
//MessageBox.Show("=2=>" + span.InnerText);
//MessageBox.Show("=2=>" + span.InnerHtml);
}
上面的三种方法都可以。
6、打印相关:
webBrowser1.ShowPrintPreviewDialog(); //打印预览对话框
//webBrowser1.ShowPrintDialog(); //打印设置对话框
//webBrowser1.Print(); //直接打印
由上图可以看出,用C#生成的两个按钮 不会在打印时出现。这一点很重要。
/////////////////////////////////////////////////
下面我上传了整个源码,有兴趣可以搞下来看看。上面的代码都在Form1.cs里面,而ExtForm.cs文件是下面要讲的内容。代码的运行环境:vs2010,代码中的两个form 要运行的话,可以修改Program.cs文件,让它选择一个运行。
////////////////////////////////////////////////
7、嵌入Ext。
很简单,就是写一个可以单独运行起来的Ext页面,嵌入到网页中就行了。下面给一个小例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css" />
<title>登陆窗体</title>
<script type="text/javascript" src="ext/adapter/ext/ext-base.js">
</script>
<script type="text/javascript" src="ext/ext-all.js">
</script>
<style type="text/css">
<!--
a:link { text-decoration: none;color: blue}
a:active { text-decoration: none;color: red}
a:hover { text-decoration:none;color: red}
a:visited { text-decoration: none;color: green}
-->
</style>
<script type="text/javascript">
var txtName = new Ext.form.TextField({
fieldLabel: '用户名',
id:"txtName"
});
var btnSubmit = new Ext.Button({
text:"登陆",
id:'btnLogin',
//scope:win,
listeners:{
"click":function(){
alert("Test!"+win.items.first().getValue()); //+">>>"+txtName.getValue());
}
}
});
var win = new Ext.Window({
title:"测试窗口",
width:220,
layout:"form",
labelWidth:45,
plain:true,
bodystyle:"padding:5px",
height:120,
buttonAlign:"center",
closeAction: 'hide',
defaults:{xtype:"textfield"},
items:[txtName,{
fieldLabel:"密码",
inputType:"password",
id:"txtPwd"
}],
buttons:[btnSubmit]
});
// win.show();
</script>
</head>
<body>
<div id="testDiv"></div>
</body>
</html>
这是一个比较简单的Ext登陆框 ,是一个浮动窗口,可以在form里面拉动,之所以要把txtName 和 btnSubmit 单独写出来 是为了能在C#代码中调用。这一点也很重要。
8、用C#代码给网页添加内容:
HtmlElement div = doc.All["testDiv"];
if (div != null)
{
div.InnerHtml = "凌云壮志 长得" + "<span id='tip_test' style='margin:50px'>" + "怎么样?</span><br/>";
div.InnerHtml += "<a id='dbl_click' style='margin:50px;' href='#'>" + "双击我试试</a>";
div.InnerHtml += "<span style='margin:50px;color:gray;text-decoration:line-through'>" + "我被删除了!</span>";
div.InnerHtml += "<span style='margin:50px;color:red;text-decoration:underline'>" + "我是新增的!</span><br/>";
div.InnerHtml += "<span style='margin:5px;'>在这右边输入文字:<input type= 'text' name= 'textfield ' style= 'border:0px;background-color:#ffffff;width:250px'></span>";
}
在id为testDiv的div里面添加一些html文本,供下面使用。上图中的button1是用C#拖出来的。
还可以用C#在网页中加入一个元素,比如一个script标签,并在里面添加js脚本:
HtmlElement script = doc.CreateElement("script");
script.SetAttribute("type", "text/javascript");
script.SetAttribute("text", "function test(){alert('OK!')}");
9、利用第8点特性,我来用Ext来实现一下气泡提示功能(当鼠标在文字:”怎么样?“ 的上方经过或停留时会出现)
HtmlElement script = doc.CreateElement("script");
script.SetAttribute("type", "text/javascript");
script.SetAttribute("text", "function test(){" +
"var tip = new Ext.Tip({" + //这是Ext的tooltip功能
" title:'大家都觉得:',"+
" html:'<span style=color:red>好帅呀!</span>',"+
" width:100"+
"});"+
"var el = Ext.get('tip_test');" +
"el.on('mouseover',function(e){" +
" tip.showBy(el,'tl-br');"+
"});"+
"el.on('mouseout',function(e){"+
" tip.hide();"+
"});" +
"}" );
10、给上面的文字:”双击我试试“加上双击事件:
HtmlElement script = doc.CreateElement("script");
script.SetAttribute("type", "text/javascript");
script.SetAttribute("text", "function test(){" +
//加双击事件
"var dbl = Ext.get('dbl_click');"+
"dbl.addListener('dblclick', dbl_clickFn);" +
"function dbl_clickFn(){alert('你双击到我了!')}");
doc.Body.AppendChild(script);
doc.InvokeScript("test");
让它被双击时弹出Ext浮动窗口:
HtmlElement script = doc.CreateElement("script");
script.SetAttribute("type", "text/javascript");
script.SetAttribute("text", "function test(){" +
//加双击事件
"var dbl = Ext.get('dbl_click');"+
"dbl.addListener('dblclick', dbl_clickFn);" +
"function dbl_clickFn(){win.setPosition(dbl.getTop(false),dbl.getLeft(false));win.show();}");
doc.Body.AppendChild(script);
doc.InvokeScript("test");
11、用js操作C#代码。
这是最诱人的应用,具体实现如下:
(1)先引入命名空间:
using System.Security.Permissions; //一定要引入命名空间
(2)在类的上面写上:
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")] //这两个是关键
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public partial class ExtForm : Form
{
}
(3)加载页面时这样加载:
string curDir = Environment.CurrentDirectory + "\\loginWindow.html";
this.webBrowser1.Url = new System.Uri(curDir, System.UriKind.Absolute);//加载本地网页
webBrowser1.ObjectForScripting = this;//不能少了这名
(4)在js中调用:
window.external.ForJsUse(txtName.getValue());
这样就可以了,给个例子:
HtmlElement script = doc.CreateElement("script");
script.SetAttribute("type", "text/javascript");
script.SetAttribute("text", "function test(){" +
//给提交按钮追加一个事件。
"btnSubmit.addListener('click',function(){window.external.ForJsUse(txtName.getValue());alert(txtName.getValue())});"
);
doc.Body.AppendChild(script);
doc.InvokeScript("test");
其中使用到的函数如下:
public void ForJsUse(string userName)
{
webBrowser1.Document.All["dbl_click"].InnerText += " 你好:" + userName;
//MessageBox.Show("--->" + userName);
}
目前就先讲这么一些应用,之后如果还用到新的内容 我再补上。
分享到:
相关推荐
综上所述,通过C#动态生成HTML,并利用WebBrowser控件在桌面应用中显示,我们可以实现丰富的交互式功能。这不仅适用于初学者,也是专业开发者日常工作中不可或缺的技能。通过不断实践和学习,你将能够更好地掌握这一...
WebBrowser控件是.NET Framework提供的一个组件,它基于Internet Explorer引擎,可以在桌面应用中模拟浏览器的功能。开发者可以使用这个控件加载HTML页面,执行JavaScript,甚至进行一些自动化操作。 二、获取...
在.NET框架中,C#的`WebBrowser`控件是一个非常实用的组件,它允许开发者在C/S(客户端/服务器)应用程序中内嵌一个浏览器,从而实现与B/S(浏览器/服务器)应用的交互。然而,`WebBrowser`控件默认使用的IE版本可能...
在.NET框架中,C#提供了一个内置的控件——`WebBrowser`,它允许开发者在Windows应用程序中嵌入一个浏览器引擎,以便展示网页内容。这个控件基于Internet Explorer的渲染引擎,因此它能够处理HTML、CSS和JavaScript...
在.NET框架中,C#提供了一个内置的控件——`WebBrowser`,它允许开发者在应用程序内部嵌入一个浏览器引擎,从而实现与网页交互的功能。本篇将详细讲解如何利用C#的`WebBrowser`控件来获取网页信息,包括HTML源代码、...
在.NET Framework中,C#的`WebBrowser`控件是一个非常实用的组件,它允许开发者在Windows应用程序中嵌入一个基于Internet Explorer内核的浏览器。然而,在使用`WebBrowser`控件浏览网页时,可能会遇到各种错误,如...
在VS.NET桌面程序中引入Web控件,实现在.NET桌面程序中集成h5页面,并呈现良好的显示效果。去除了EO.WebBrowser.WebView第一次加载时弹框的问题,并且保证视频在EO.WebBrowser.WebView中的正常播放
在WinForm应用中,`WebBrowser`控件是一个非常实用的组件,它允许开发者在应用程序内部集成网页浏览功能。通常,`WebBrowser`控件默认使用的是Internet Explorer的Web渲染引擎,但在某些情况下,开发者可能希望使用...
总的来说,通过使用`Microsoft.Toolkit.Win32.UI.Controls`库和`WebView2`控件,C#开发者可以在他们的应用程序中享受到Chromium的强大功能,从而提供更好的网页浏览体验。这不仅包括HTML5和CSS3的支持,还包括...
在C#编程中,WebBrowser控件是一个非常实用的组件,它允许开发者在应用程序中集成网页浏览功能。本文将深入探讨如何在C#中利用内存来获取WebBrowser控件的截图,实现后台或隐藏窗体的截图功能。这对于自动化测试、...
在.NET框架中,C# WebBrowser控件是一个强大的工具,它允许开发者在应用程序中嵌入一个基于Internet Explorer的浏览器引擎,从而实现与网页的交互。本篇将详细讲解如何利用C# WebBrowser控件来伪装成浏览器访问网页...
在IT领域,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用和Web应用程序时。WebBrowser控件是.NET框架提供的一种强大工具,允许开发者在应用程序中嵌入一个基于Internet Explorer内核的浏览器,用于显示...
在C#编程中,WebBrowser控件是一个强大的工具,它允许开发者在Windows应用程序中...通过这种方式,开发者可以轻松地在C#应用程序中实现对WebBrowser控件加载页面的cookie的读取和管理,从而支持更复杂的网页交互需求。
1,在项目中引用程序集拓展中的Microsoft.mshtml后,可以在公共控件中找到WebBrowser控件。 2,在窗体中加入三个按钮,然后添加WebBrowser控件,右键控件选属性,设置相应的属性。 3,设置WebBrowser控件的属性 ...
在C#桌面程序中,如果涉及到与Web界面的交互,例如嵌入WebBrowser控件,JQuery可以帮助开发者更轻松地控制页面元素。 **测试**:软件质量的保证离不开测试,C#提供了诸如NUnit、MSTest等单元测试框架,用于编写和...
总的来说,"C# 用WebBrowser实现的多页面浏览器"项目为学习和实践C#编程,尤其是Windows桌面应用开发提供了很好的素材。它不仅展示了如何利用WebBrowser控件创建一个功能完备的浏览器,还揭示了如何通过DOM操作和...
在本项目中,我们使用C#来编写控制台应用程序或Windows Forms应用程序。 2. **WebBrowser控件**:这是.NET Framework提供的一种内置控件,可以嵌入到Windows应用程序中,让用户在应用内部浏览网页。通过这个控件,...
在C#编程中,`WebBrowser`控件是一个非常重要的组件,它允许开发者在应用程序中嵌入一个浏览器引擎,从而实现网页的显示和交互。这个控件基于Internet Explorer的技术,因此与IE浏览器的版本密切相关。在本文中,...
在开发C#项目时用到的WebBrowser,文档中汇总了该控件的属性和方法实现。包含代码实现。属性方法不足的地方希望大家补充。