Problème: Votre application C # WPF (.NET 4) L'utilisation d'un contrôle WebBrowser
peut ressentir des écarts d'appel Ajax par rapport à un navigateur complet d'explorateur Internet (IE). Cela se manifeste souvent comme un message "Votre demande est en cours de traitement" sans achèvement.
Cause profonde: Le moteur de rendu du contrôle WebBrowser
ne reflète pas toujours parfaitement le comportement de IE. Cette incompatibilité peut affecter les fonctionnalités JavaScript et AJAX.
Solution: Contrôle des fonctionnalités via la manipulation du registre
La clé pour résoudre ceci est ajusté le mode d'émulation du contrôle WebBrowser
à l'aide du contrôle des fonctionnalités. Cela implique de modifier les paramètres de registre pour aligner le comportement du contrôle de plus près avec une version IE spécifique. Le code suivant évite de nécessiter des privilèges d'administrateur en ciblant le registre de l'utilisateur actuel.
Exemple de code:
cet extrait de code définit la clé de registre FEATURE_BROWSER_EMULATION
pour correspondre à une version IE détectée. Il montre également une fonction pour récupérer le mode d'émulation approprié en fonction de la version IE installée. N'oubliez pas d'ajouter les instructions using
nécessaires pour Microsoft.Win32
et System
.
<code class="language-csharp">private void SetBrowserFeatureControlKey(string feature, string appName, uint value) { using (var key = Registry.CurrentUser.CreateSubKey( $@"Software\Microsoft\Internet Explorer\Main\FeatureControl\{feature}", RegistryKeyPermissionCheck.ReadWriteSubTree)) { key.SetValue(appName, (uint)value, RegistryValueKind.DWord); } } private uint GetBrowserEmulationMode() { uint mode = 11000; // Default to IE11 emulation try { using (var ieKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer")) { var version = ieKey?.GetValue("svcVersion") ?? ieKey?.GetValue("Version"); if (version != null) { if (int.TryParse(version.ToString().Split('.')[0], out int browserVersion)) { switch (browserVersion) { case 7: mode = 7000; break; case 8: mode = 8000; break; case 9: mode = 9000; break; case 10: mode = 10000; break; } } } } } catch { /* Ignore registry access errors */ } return mode; } private void SetBrowserFeatureControl() { uint mode = GetBrowserEmulationMode(); SetBrowserFeatureControlKey("FEATURE_BROWSER_EMULATION", Application.ProductName, mode); } // Call SetBrowserFeatureControl() before initializing the WebBrowser control. For example: public MainWindow() { SetBrowserFeatureControl(); InitializeComponent(); }</code>
Considérations importantes:
GetBrowserEmulationMode
inclut la gestion des erreurs de base pour gérer gracieusement les problèmes d'accès au registre potentiel. Application.ProductName
est utilisée pour identifier votre application dans le registre. Vous devrez peut-être ajuster cela si le nom de votre application diffère. FEATURE_BROWSER_EMULATION
soit crucial, d'autres contrôles de fonctionnalité peuvent être nécessaires en fonction des problèmes spécifiques de l'AJAX rencontrés. Consultez la documentation de Microsoft pour une liste complète. En mettant en œuvre cette solution, vous devez atteindre une plus grande cohérence entre votre contrôle WebBrowser
et la pleine IE, la résolution des problèmes AJAX. N'oubliez pas de tester soigneusement après la mise en œuvre de ces modifications.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!