C# Webbrowser Control dan Ajax Call
Penerangan Masalah
Apabila menggunakan kawalan webbrowser dalam aplikasi C# WPF .NET 4, klik butang untuk bertindak balas tanpa respons. Halaman menunjukkan mesej "Permintaan anda sedang diproses" untuk mengelakkan halaman daripada terus diproses. Masalah ini tidak berlaku menggunakan penyemak imbas IE yang lengkap.
Analisis Masalah
WPF dan WinForms Webbrowser Controls adalah jauh berbeza daripada pelayar IE yang lengkap dalam tingkah laku. Perbezaan ini boleh menyebabkan masalah keserasian skrip. penyelesaian
Tingkah laku kawalan webbrowser adalah konsisten dengan pelayar IE dengan melaksanakan kawalan fungsi. Ini melibatkan menetapkan fungsi tertentu, seperti Feature_Browser_emortion, yang boleh dilaksanakan tanpa kebenaran pentadbir.
Contoh kod
Cara menggunakan contoh
penyebaran
<code class="language-csharp">private void SetBrowserFeatureControlKey(string feature, string appName, uint value) { using (var key = Registry.CurrentUser.CreateSubKey( String.Concat(@"Software\Microsoft\Internet Explorer\Main\FeatureControl\", feature), RegistryKeyPermissionCheck.ReadWriteSubTree)) { key.SetValue(appName, (UInt32)value, RegistryValueKind.DWord); } }</code>
Untuk memastikan perubahan ini berkesan, fungsi yang diperlukan harus didaftarkan sebelum inisialisasi webbrowser, biasanya dalam pembina tetingkap utama.
<code class="language-csharp">private void SetBrowserFeatureControl() { // 获取进程特定设置 var fileName = System.IO.Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName); // 确保控件不在Visual Studio设计器中运行 if (String.Compare(fileName, "devenv.exe", true) == 0 || String.Compare(fileName, "XDesProc.exe", true) == 0) return; SetBrowserFeatureControlKey("FEATURE_BROWSER_EMULATION", fileName, GetBrowserEmulationMode()); // IE10 标准模式,适用于具有基于标准的 !DOCTYPE 指令的页面。 SetBrowserFeatureControlKey("FEATURE_AJAX_CONNECTIONEVENTS", fileName, 1); SetBrowserFeatureControlKey("FEATURE_ENABLE_CLIPCHILDREN_OPTIMIZATION", fileName, 1); SetBrowserFeatureControlKey("FEATURE_MANAGE_SCRIPT_CIRCULAR_REFS", fileName, 1); SetBrowserFeatureControlKey("FEATURE_DOMSTORAGE", fileName, 1); SetBrowserFeatureControlKey("FEATURE_GPU_RENDERING", fileName, 1); SetBrowserFeatureControlKey("FEATURE_IVIEWOBJECTDRAW_DMLT9_WITH_GDI", fileName, 0); SetBrowserFeatureControlKey("FEATURE_DISABLE_LEGACY_COMPRESSION", fileName, 1); SetBrowserFeatureControlKey("FEATURE_LOCALMACHINE_LOCKDOWN", fileName, 0); SetBrowserFeatureControlKey("FEATURE_BLOCK_LMZ_OBJECT", fileName, 0); SetBrowserFeatureControlKey("FEATURE_BLOCK_LMZ_SCRIPT", fileName, 0); SetBrowserFeatureControlKey("FEATURE_DISABLE_NAVIGATION_SOUNDS", fileName, 1); SetBrowserFeatureControlKey("FEATURE_SCRIPTURL_MITIGATION", fileName, 1); SetBrowserFeatureControlKey("FEATURE_SPELLCHECKING", fileName, 0); SetBrowserFeatureControlKey("FEATURE_STATUS_BAR_THROTTLING", fileName, 1); SetBrowserFeatureControlKey("FEATURE_TABBED_BROWSING", fileName, 1); SetBrowserFeatureControlKey("FEATURE_VALIDATE_NAVIGATE_URL", fileName, 1); SetBrowserFeatureControlKey("FEATURE_WEBOC_DOCUMENT_ZOOM", fileName, 1); SetBrowserFeatureControlKey("FEATURE_WEBOC_POPUPMANAGEMENT", fileName, 0); SetBrowserFeatureControlKey("FEATURE_WEBOC_MOVESIZECHILD", fileName, 1); SetBrowserFeatureControlKey("FEATURE_ADDON_MANAGEMENT", fileName, 0); SetBrowserFeatureControlKey("FEATURE_WEBSOCKET", fileName, 1); SetBrowserFeatureControlKey("FEATURE_WINDOW_RESTRICTIONS", fileName, 0); SetBrowserFeatureControlKey("FEATURE_XMLHTTP", fileName, 1); } private UInt32 GetBrowserEmulationMode() { int browserVersion = 7; using (var ieKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer", RegistryKeyPermissionCheck.ReadSubTree, System.Security.AccessControl.RegistryRights.QueryValues)) { var version = ieKey.GetValue("svcVersion"); if (null == version) { version = ieKey.GetValue("Version"); if (null == version) throw new ApplicationException("需要安装Microsoft Internet Explorer!"); } int.TryParse(version.ToString().Split('.')[0], out browserVersion); } UInt32 mode = 11000; // IE11 标准模式 switch (browserVersion) { case 7: mode = 7000; // IE7 标准模式 break; case 8: mode = 8000; // IE8 模式 break; case 9: mode = 9000; // IE9 模式 break; case 10: mode = 10000; // IE10 模式 break; default: // 默认使用 IE11 模式 break; } return mode; }</code>
Untuk fungsi yang lebih komprehensif, sila rujuk jawapan kemas kini yang disediakan dalam pautan yang berkaitan.
Output Revied ini mengekalkan imej asal dan menggunakan lebih banyak bahasa semulajadi semasa mengaplikasikan kandungan
Atas ialah kandungan terperinci Bagaimana untuk memperbaiki kawalan C# webbrowser yang tidak responsif semasa panggilan Ajax?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!