WebBrowser控件和Windows窗体之间的交互
我正在管理各种联系信息 – 电话,地址,电子邮件,IM,其他我希望它看起来不错并节省空间,所以我想在WebBrowser控件中显示它。 我可以动态地将标记和内容创建到流中,并以任何格式显示它,颜色和字体大小可以轻松调整。 我还可以将按钮添加到“添加”,“编辑”和“删除”。 我喜欢这种方法,因为它看起来比RichTextBox更容易和更好看(如果不这样的话,请更正我。)
问题是关于响应这些按钮。 如果选择了一个,我想隐藏WebBrowser并取消隐藏Panel,其中包含允许输入新联系人或编辑现有联系人所需的TextBox控件。 我听说过这个可以做到的。 我希望得到一些建议。 我能想到的只是一些代码来获取一个AJAX调用,这会引发一个Windows事件,但这看起来很奇怪。
任何想法,链接或建议都会受到赞赏..或者甚至是一个很好的理由,为什么不这样做,但它似乎是高质量的信息呈现的好主意,我已经动态生成了大量的HTML。
您可以使用JavaScript操作Form
和Controls
或从WebBrowser
调用C#方法,还可以操作WebBrowser
控件的内容或从C#调用JavaScript方法。
从Html操纵WinForms
要从WebBrowser
控件操作Form
并调用C#方法并访问表单属性,您应该使用[ComVisibleAttribute(true)]
装饰表单,然后可以将表单设置为WebBrowser
控件的ObjectForScripting
属性。
[ComVisibleAttribute(true)] public partial class Form1 : Form { private void Form1_Load(object sender, EventArgs e) { this.webBrowser1.ObjectForScripting = this; } }
然后,您可以通过以下方式调用方法并访问窗口元素:
从JavaScript调用C#方法:
window.external.SomeCSMethod('Method called from JavaScript');
从JavaScript设置WinForms控件的值:
通过使用desginer将Modifier
属性的值设置为public,使Form
上的textBox1
控件成为公共控件。 然后可以从JavaScript访问它:
window.external.textBox1.Text='Value set from JavaScript';
从WinForms操作Html
您可以使用C#代码处理Web浏览器控件的html内容,并使用WebBrowser
控件的Document
属性方法调用JavaScript方法或设置html元素的值:
从C#调用JavaScript方法:
this.webBrowser1.Document.InvokeScript("someJSMethod", new []{"Method called from C#"});
从C#设置Html控件的值:
this.webBrowser1.Document.GetElementById("text1") .SetAttribute("Value set from C#", "Value From C#");
示例代码:
您可以创建一个Form1
类,并将button1
和button2
以及textBox1
和webBrowser1
放在Form
将textBox1
的Modifer
设置为public:
[ComVisibleAttribute(true)] public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Load += Form1_Load; button1.Click += button1_Click; button2.Click += button2_Click; } private void Form1_Load(object sender, EventArgs e) { this.webBrowser1.DocumentText = @" Test
"; this.webBrowser1.ObjectForScripting = this; } public void SomeCSMethod(string value) { MessageBox.Show(value); } private void button1_Click(object sender, EventArgs e) { this.webBrowser1.Document .InvokeScript("someJSMethod", new[]{ "Method called from C#" }); } private void button2_Click(object sender, EventArgs e) { this.webBrowser1.Document.GetElementById("text1") .SetAttribute("value", "Value set from C#"); } }