C# WebBrowser CSS 悬停样式不起作用(尽管配置了浏览器仿真)

Posted

技术标签:

【中文标题】C# WebBrowser CSS 悬停样式不起作用(尽管配置了浏览器仿真)【英文标题】:C# WebBrowser CSS hover style not working (despite configuration of browser emulation) 【发布时间】:2017-08-27 17:25:35 【问题描述】:

尝试在 Winforms 中使用 WebBrowser 控件,因为我真的想使用 html5/CSS 来设置 GUI 样式(很高兴在 C# 中接收事件)。但是悬停样式不起作用。

因此打开一个 C# Winforms 项目并将其命名为 HoverNotWorking。添加一个名为 HTMLPage1.html 的新 HTML 页面并粘贴以下 HTML

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
    <style>
        a#clickMe:hover 
            background-color: #1A365B;
            color: white;
        

        a#clickMe 
            background-color: #E0F1EA;
            color: #000000;
        
    </style>
</head>
<body>
    <a id="clickMe">Click Me2</a>
</body>
</html>

请随意验证它是否可以在普通浏览器中运行,对我有用。

转到 Form1 并添加一个 WebBrowser 控件。

一个尝试的解决方案是配置 WebBrowser 的浏览器仿真(我不知道这是可能的,恐怕仅限于 IE 版本)。所以我把这段代码放在Main(),所以看起来像这样(解决使用问题)

    [STAThread]
    static void Main()
    
        // Make WebBrowser control emulate IE11
        // https://msdn.microsoft.com/en-us/library/ee330730(v=vs.85).aspx#BROWSER_EMULATION
        RegistryKey keyIeFeatureControl = Registry.LocalMachine.OpenSubKey(
                @"Software\Microsoft\Internet Explorer\Main\FeatureControl");
        RegistryKey keyIeFeatureBrowserEmulation = keyIeFeatureControl.OpenSubKey(
                "FEATURE_BROWSER_EMULATION", true);
        keyIeFeatureBrowserEmulation.SetValue(System.Reflection.Assembly.
            GetExecutingAssembly().GetName().Name, 69632); // 69632 = &h11000
        keyIeFeatureBrowserEmulation.Close();
        keyIeFeatureControl.Close();


        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    

在 Form1.cs 文件中,我们需要一些代码来定位解决方案顶部文件夹中的 HTMLPage1.html。否则代码很普通。

public partial class Form1 : Form

    public Form1()
    
        InitializeComponent();

        Assembly myExe = System.Reflection.Assembly.GetExecutingAssembly();
        string filePath = Path.GetDirectoryName(new Uri(myExe.CodeBase).LocalPath);
        string myFile = System.IO.Path.Combine(filePath, @"..\..\HTMLPage1.html");

        if (File.Exists(myFile))
        
            this.webBrowser1.Navigate(myFile);
        
    

但是悬停 CSS 拒绝工作。现在我确定我可以使用事件处理程序来捕获鼠标悬停等,但这不是重点。这应该有效。我已将浏览器控件配置为使用 IE11,非常现代的版本。这应该可以。

我错过了什么?

【问题讨论】:

【参考方案1】:

我做了你所描绘的。在我用 11000 替换 69632 并以这种方式获得程序进程的正确名称后,一切都解决了:

var fileName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

所以设置参数是:

keyIeFeatureBrowserEmulation.SetValue(fileName, 11000);

【讨论】:

非常好,非常感谢。我很高兴现在可以继续。

以上是关于C# WebBrowser CSS 悬停样式不起作用(尽管配置了浏览器仿真)的主要内容,如果未能解决你的问题,请参考以下文章

CSS样式:悬停时如何更改图像?

悬停链接时,css 声明不起作用

表单 CSS 输入:悬停和输入:焦点在 IE 中不起作用

div 样式不正确(HTML 和 CSS)

C# WebBrowser 控件 - 使用 InvokeMember("Click") 提交表单不起作用

.NET WebBrowser - FireBug 样式检查 HTML 元素