Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk memperbaiki kawalan C# webbrowser yang tidak responsif semasa panggilan Ajax?

Bagaimana untuk memperbaiki kawalan C# webbrowser yang tidak responsif semasa panggilan Ajax?

DDD
Lepaskan: 2025-01-30 20:36:09
asal
564 orang telah melayarinya

How to Fix Unresponsive C# WebBrowser Control During Ajax Calls?

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>
Salin selepas log masuk

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>
Salin selepas log masuk
Tetapan ciri yang lebih komprehensif

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan