首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过鼠标悬停窗体应用程序的WebBrowser控件中的HTML元素来显示弹出窗口

如何通过鼠标悬停窗体应用程序的WebBrowser控件中的HTML元素来显示弹出窗口
EN

Stack Overflow用户
提问于 2021-02-19 15:30:25
回答 1查看 41关注 0票数 0

在下面的代码中,C#和js链接在一起,并使用ToolStripDropDown创建弹出窗口,但是当鼠标离开HTML元素时,js的mouseleave事件不会触发。

但是,当我将鼠标移到弹出窗口上时,mouseleave事件就会触发。如果将鼠标从其他方向移开,则不会激发mouseleave事件。

此外,当C#端没有显示弹出窗口时,它似乎会触发。我试着写一段代码,在显示之后专注于WebBrowser控件,但即使这样,鼠标的js也不会触发。我想知道为什么会这样。

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp5
{
    public partial class Form1 : Form
    {
        public ToolStripDropDown toolStripDropDown;

        public Form1()
        {
            InitializeComponent();

            toolStripDropDown = new ToolStripDropDown();
            toolStripDropDown.Margin = Padding.Empty;
            toolStripDropDown.Padding = Padding.Empty;
            toolStripDropDown.DropShadowEnabled = false;

            webBrowser1.ObjectForScripting = new TestClasss(this);
            webBrowser1.DocumentText = @"<script>
                window.onload = function() {
                    var elm = document.createElement('div');
                    elm.innerHTML = 'test';
                    document.body.appendChild(elm);

                    elm.onmouseover = function() {
                        window.external.ShowPopup(this.getBoundingClientRect().left, this.getBoundingClientRect().top);
                    };

                    elm.onmouseleave = function()
                    {
                        window.external.ClosePopup();
                    };
                };
            </script>";
        }
    }

    [ComVisible(true)]
    public class TestClasss
    {
        private Form1 viewer;

        public TestClasss(Form1 viewer)
        {
            this.viewer = viewer;
        }

        public void ShowPopup(int x, int y)
        {
            var panel1 = new Panel();
            panel1.BackColor = Color.Red;

            var label1 = new Label();
            label1.Text = "popup";
            panel1.Controls.Add(label1);

            var toolStripControlHost = new ToolStripControlHost(panel1);
            toolStripControlHost.Margin = Padding.Empty;
            toolStripControlHost.Padding = Padding.Empty;

            viewer.toolStripDropDown.Items.Clear();
            viewer.toolStripDropDown.Items.Add(toolStripControlHost);
            viewer.toolStripDropDown.Show(viewer.webBrowser1, new Point(x, y), ToolStripDropDownDirection.AboveRight);
        }

        public void ClosePopup()
        {
            viewer.toolStripDropDown.Close();
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-02-19 16:38:53

试试这段代码

使用系统;

使用System.Collections.Generic;

使用System.ComponentModel;

使用System.Data;

使用System.Drawing;

使用System.Text;

使用System.Windows.Forms;

命名空间WindowsApplication1

{

代码语言:javascript
复制
public partial class Form5 : Form
{
    public Form5()
    {
        InitializeComponent();
        webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
    }

    void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        webBrowser1.Document.Body.MouseOver += new HtmlElementEventHandler(Body_MouseOver);
    }

    void Body_MouseOver(object sender, HtmlElementEventArgs e)
    {
        if (e.ToElement != null && e.ToElement.TagName == "H1" && e.ToElement.GetAttribute("processed") != "true")
        {
            string[] words = e.ToElement.InnerHtml.Split(' ');
            e.ToElement.InnerHtml = "";
            for (int i = 0; i < words.Length; i++)
                e.ToElement.InnerHtml += "<span> " + words[i] + " </span>";

            foreach (HtmlElement el in e.ToElement.GetElementsByTagName("span"))
                el.MouseOver += new HtmlElementEventHandler(e_MouseOver);

            e.ToElement.SetAttribute("processed", "true");
        }
    }

    void e_MouseOver(object sender, HtmlElementEventArgs e)
    {
        toolStripTextBox1.Text = e.ToElement.InnerText;
    }


}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66273390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档