本文实现了WebBrowser的简单例子
1.tian引用System.Windows.Froms.dll
2.引用WindowsFormsIntegration.dll
代码如下:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
Window _w = new Window();
web_control web_c = new web_control("http://www.baidu.com");
_w.Content = web_c;
_w.Owner = this;
_w.Show();
}
}
public class web_control : UserControl
{
public System.Windows.Forms.WebBrowser _web_browser;
public web_control(string url)
{
_web_browser = new System.Windows.Forms.WebBrowser();
_web_browser.ObjectForScripting = new external_dispath(this);
var host = new System.Windows.Forms.Integration.WindowsFormsHost();
host.Child = _web_browser;
Content = host;
Loaded += (senser, e) =>
{
_web_browser.Navigate(url);
};
}
}
至此,上方实现了简单的例子(除了红色那一句之外)
=========================================17.7.21更新以下========================================================
但在后来遇到要与JS交互,在webBrowser使用过程中为了C#和JS通讯,webBrowser必须设置ObjectForScripting的属性,
它是一个object,这个object可以提供给webBrowser控件载入的网页上的script访问。(上方红色语句)
在设置过webBrowser控件的ObjectForScripting属性后,还需要设置应用程序对com可见,不然会抛出一个异常
(ObjectForScripting 的类必须对 COM 可见。请确认该对象是公共的,或考虑向您的类添加 ComVisible 属性。),可做如下设置:
[System.Runtime.InteropServices.ComVisibleAttribute(true)] //使接口可见
public class external_dispath
{
public web_control m_wbcontrol;
public external_dispath(web_control wb_c)
{
m_wbcontrol = wb_c;
}
public Object createObject(String name)
{
return new external_dispath(m_wbcontrol);
}
public void closeWebDlg() //为了让JS调的,作用是关闭网页弹窗
{
(m_wbcontrol.Parent as Window).Close();
}
通过在c#这一层实现external类,来达到在点击网页中右上角的关闭按钮时,关闭网页的弹窗
}
JS代码:
$(".close-btn").on("click",function(
e){
e.preventDefault();
TA.log({ld:'client', id:'lhb_kx_gb'});
try{
external.closeWebDlg(); //调用外部的函数
}catch (e){} });
最后疑问是external是哪里来的,JS和C#是怎么约定的,以后在学习JS后可能会有深好理解
相关文章
- 第4章-Vue.js 交互及实例的生命周期
- js和servlet之间用json的数据格式进行交互
- QWebengineView和js交互
- C#委托(delegate)的常用方式- 委托的定义 // 委托的核心是跟委托的函数结构一样 public delegate string SayHello(string c); public delegate string SayHello(string c);:定义了一个公共委托类型 SayHello,该委托接受一个 string 类型的参数 c,并返回一个 string 类型的值。 Main 方法 static void Main(string args) { // 本质上其实就是把方法当作委托的参数 SayHello sayC = new SayHello(SayChinese); Console.WriteLine(sayC("欢迎大家")); SayHello sayE = new SayHello(SayEgnlish); Console.WriteLine(sayE("Welcome to")); // 简单的写法:必须类型一样 SayHello s1 = SayChinese; SayHello s2 = SayEgnlish; Console.WriteLine(s1("好好好")); Console.WriteLine(s2("Gooood")); // 最推荐 SayHello ss1 = con => con; Console.WriteLine(ss1("niiiice")); // 匿名委托:一次性委托 SayHello ss3 = delegate(string s) { return s; }; Console.WriteLine(ss3("说中国话")); } 常规实例化委托 SayHello sayC = new SayHello(SayChinese);:创建了一个 SayHello 委托的实例 sayC,并将 SayChinese 方法作为参数传递给委托的构造函数。 Console.WriteLine(sayC("欢迎大家"));:通过委托实例调用 SayChinese 方法,并输出结果。 同理,SayHello sayE = new SayHello(SayEgnlish); 和 Console.WriteLine(sayE("Welcome to")); 是对 SayEgnlish 方法的委托调用。 简化的委托赋值方式 SayHello s1 = SayChinese; 和 SayHello s2 = SayEgnlish;:当委托类型和方法签名一致时,可以直接将方法赋值给委托变量,无需使用 new 关键字。 Console.WriteLine(s1("好好好")); 和 Console.WriteLine(s2("Gooood"));:通过委托实例调用相应的方法。 使用 Lambda 表达式实例化委托 SayHello ss1 = con => con;:使用 Lambda 表达式创建委托实例 ss1,con => con 表示接受一个参数 con 并返回该参数本身。 Console.WriteLine(ss1("niiiice"));:通过委托实例调用 Lambda 表达式。 匿名委托 SayHello ss3 = delegate(string s) { return s; };:使用匿名委托创建委托实例 ss3,delegate(string s) { return s; } 是一个匿名方法,直接在委托实例化时定义了方法体。 Console.WriteLine(ss3("说中国话"));:通过委托实例调用匿名方法。 委托引用的方法定义 public static string SayChinese(string content) { return content; } public static string SayEgnlish(string content) { return content; } public static string SayChinese(string content) 和 public static string SayEgnlish(string content):定义了两个静态方法,分别接受一个 string 类型的参数 content,并返回该参数本身。这两个方法的签名与 SayHello 委托一致,可以被 SayHello 委托引用。 常规的委托实例化、简化的赋值方式、Lambda 表达式和匿名委托。委托在 C# 中是一种强大的机制,它允许将方法作为参数传递,实现了代码的灵活性和可扩展性。
- CSS样式表初学,比C#和JS简单
- SpringBoot和前端数据交互(js,jQuery,thymeleaf)
- js给html添加style,js改变style样式和css样式的简单实例
- C#读取对象实例的值和对对象的属性自动赋值方法
- Cytoscape.js – 用于数据分析和可视化的交互图形库
- js静态方法和实例方法