C# WebBrowser CSS 悬停样式不起作用(尽管配置了浏览器仿真)
C# WebBrowser CSS hover style not working (despite configuration of browser emulation)
尝试在 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,非常现代的版本。这应该有效。
我错过了什么?
你画的我做了。在我用 11000 替换 69632 并以这种方式获得程序过程的正确名称后,一切正常:
var fileName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
所以设置参数为:
keyIeFeatureBrowserEmulation.SetValue(fileName, 11000);
尝试在 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,非常现代的版本。这应该有效。
我错过了什么?
你画的我做了。在我用 11000 替换 69632 并以这种方式获得程序过程的正确名称后,一切正常:
var fileName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
所以设置参数为:
keyIeFeatureBrowserEmulation.SetValue(fileName, 11000);