2013-08-20 11 views
30

Sto utilizzando un controllo webbrowser integrato nell'app C4 WPF .NET. Ogni volta che premo manualmente il pulsante in un modulo, il browser si blocca sul messaggio "La richiesta viene elaborata" e non accade nulla. Se faccio lo stesso in pieno browser IE la pagina viene elaborata normalmente producendo i risultati. Cosa mi manca? Grazie Il codice dietro il pulsante è la seguenteC# web browser Ajax call

<a onclick="startSearch();" href="javascript:void(-1);" name="btnNext" class="btn floatLe noClear btnSubmit btnRight"> 
<span>Continue</span> 
</a> 

risposta

95

Aggiornato, Io attualmente uso e raccomando una serie di caratteristiche che possono essere trovati here.


controllo del browser web (entrambe le versioni di WPF e WinForms) si comporta in molti modi in modo diverso dalla piena di IE. Si consiglia di implementare Feature Control per portare il suo comportamento il più vicino possibile a IE (in particolare, FEATURE_BROWSER_EMULATION). Si spera che il problema sarà risolto. Ecco il codice:

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

Ad esempio:

private void SetBrowserFeatureControl() 
{ 
    // http://msdn.microsoft.com/en-us/library/ee330720(v=vs.85).aspx 

    // FeatureControl settings are per-process 
    var fileName = System.IO.Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName); 

    // make the control is not running inside Visual Studio Designer 
    if (String.Compare(fileName, "devenv.exe", true) == 0 || String.Compare(fileName, "XDesProc.exe", true) == 0) 
     return; 

    SetBrowserFeatureControlKey("FEATURE_BROWSER_EMULATION", fileName, GetBrowserEmulationMode()); // Webpages containing standards-based !DOCTYPE directives are displayed in IE10 Standards mode. 
    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 is required!"); 
     } 
     int.TryParse(version.ToString().Split('.')[0], out browserVersion); 
    } 

    UInt32 mode = 11000; // Internet Explorer 11. Webpages containing standards-based !DOCTYPE directives are displayed in IE11 Standards mode. Default value for Internet Explorer 11. 
    switch (browserVersion) 
    { 
     case 7: 
      mode = 7000; // Webpages containing standards-based !DOCTYPE directives are displayed in IE7 Standards mode. Default value for applications hosting the WebBrowser Control. 
      break; 
     case 8: 
      mode = 8000; // Webpages containing standards-based !DOCTYPE directives are displayed in IE8 mode. Default value for Internet Explorer 8 
      break; 
     case 9: 
      mode = 9000; // Internet Explorer 9. Webpages containing standards-based !DOCTYPE directives are displayed in IE9 mode. Default value for Internet Explorer 9. 
      break; 
     case 10: 
      mode = 10000; // Internet Explorer 10. Webpages containing standards-based !DOCTYPE directives are displayed in IE10 mode. Default value for Internet Explorer 10. 
      break; 
     default: 
      // use IE11 mode by default 
      break; 
    } 

    return mode; 
} 

si dovrebbe venire con il proprio set of features e registrare prima del browser web è stato inizializzato, ad esempio, nel costruttore principale forma:

public MainWindow() 
{ 
    SetBrowserFeatureControl(); 

    InitializeComponent(); 
//... 
} 
+3

questo è semplicemente eccellente ,,, ha funzionato come un fascino – Jim

+1

@Jim, ho aggiunto un controllo per "XDesProc.exe" (processo VS XAML Designer), potresti voler aggiornare anche il tuo codice. – Noseratio

+1

Great, thanks everythink working good – Jim