2 votes

C# WebBrowser CSS hover style ne fonctionne pas (malgré la configuration de l'émulation du navigateur)

J'essaie de travailler avec le contrôle WebBrowser dans un Winforms parce que je veux vraiment utiliser HTML5/CSS pour styliser une interface graphique (je me contente d'utiliser les événements en C#). Mais un style de survol ne fonctionne pas.

Ouvrez donc un projet C# Winforms et appelez-le HoverNotWorking. Ajoutez une nouvelle page HTML appelée HTMLPage1.html et collez-y le HTML suivant

<!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>

N'hésitez pas à vérifier qu'il fonctionne dans un navigateur ordinaire, c'est le cas pour moi.

Allez dans le Form1 et ajoutez un contrôle WebBrowser.

Une tentative de solution consistait à configurer l'émulation de navigateur de WebBrowser (je ne savais pas que c'était possible, limité aux versions d'IE, j'en ai peur). J'ai donc placé ce code dans Main() donc cela ressemble à ceci (résolvez les utilisations)

    [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());
    }

Et dans le fichier Form1.cs nous avons besoin d'un petit code pour localiser le HTMLPage1.html dans le dossier supérieur des solutions. Sinon, le code est tout à fait ordinaire.

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);
        }
    }
}

Mais le CSS de survol refuse de fonctionner. Je suis sûr que je pourrais créer un gestionnaire d'événements pour capturer le survol de la souris, etc. mais ce n'est pas le problème. Cela devrait fonctionner. J'ai configuré le contrôle du navigateur pour utiliser IE11, une version très moderne. Cela devrait fonctionner.

Qu'est-ce que je rate ?

1voto

Oleg Safarov Points 2082

J'ai fait ce que vous avez dépeint. Tout a fonctionné après avoir remplacé 69632 par 11000 et obtenu le nom correct du processus de programme de cette façon :

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

Donc ce paramètre est fixé :

keyIeFeatureBrowserEmulation.SetValue(fileName, 11000);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X