2017-07-28 1 views
1

So habe ich einen Albtraum zu versuchen, CKeditor in WPF Webbrowser-Steuerelement ausführen. Kundenspezifischer CSS-Editor, den unsere Firma für ihre Webseiten verwendet, löst einen Fehler aus, der auf nichts hinweist. Zeile 0, aber es funktioniert überall sonst, einschließlich IE. Basispaket, Semi-Lasten, löst jedoch einen nicht definierten Fehler aus und bleibt in der Ladephase ausgegraut. Dies ist mit dem neuesten ck Editor 4.7. Ich habe versucht, mit Version 3.6, mit denen überhaupt nichts passiert, wirft Ckeditor keinen Fehler, lädt aber auch nicht (funktioniert gut außerhalb von WPF-Browser).ckeditor in WPF WebBrowser-Steuerelement

Hier ist ein paar grundlegende HTML-Code, den ich in den wpfbrowser injiziere.

  WebBrowser webBrowser = dependencyObject as WebBrowser; 
     if (webBrowser != null) 
     { 
      var html = "<head>" + 

         "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />" + 
         "<meta charset=\"UTF-8\">" + 

         // $"<script type=\"text/javascript\" src=\"{ResourceDir}MathJax\\MathJax.js?config=MML_HTMLorMML,default\"></script>" + 
         $"<script type=\"text/javascript\" src=\"{ResourceDir}ckeditor\\ckeditor.js\"></script>" + 
         $"<script type=\"text/javascript\" src=\"{ResourceDir}JavaScript\\essay.js\"></script>" + 
         // $"<link rel=\"stylesheet\" type=\"text/css\" href=\"{ResourceDir}\\CSS\\main.css\">" + 

         "</head>" + 

         "<body>" + 
         "   <form>\r\n" + 
         "   <textarea name=\"editor\" id=\"editor\" rows=\"10\" cols=\"80\">\r\n" + 
            $"Hello World!" + /*{e.NewValue}*/ 
         "   </textarea>\r\n" + 
         "  </form>"+ 
         " <button onclick=\"ReplaceEditor()\">Click me</button> " + 
         "</body>"; 

      webBrowser.NavigateToString(html); 

Andere Javascript wie Mathjax und so weiter funktioniert gut, ignorieren Sie bitte die Art, wie ich HTML bauen, seine jetzt nicht relevant.

Dies ist essay.js Inhalt

function ReplaceEditor() { 
CKEDITOR.replace('editor'); 
} 
window.onerror = function (message, url, lineNumber) { 
    window.external.GetErrors(message, url, lineNumber); 
} 

fangen Fehler viel hilft nicht, da sie in derselben Zeile 0 Zeichen 0, dass Web-Browser für alle Fehler wirft zurückgibt. Irgendwelche Hilfe geschätzt, von dem, was ich gelesen habe, sollte es arbeiten, wie Leute es vorher arbeiten ließen.

+0

Schon da gewesen. Sehen Sie, ob [dies] (https://stackoverflow.com/a/18333982/1768303) hilft. – Noseratio

+0

Leider beharrt das Problem immer noch, auch diese Registry Tweaks, brach meine anderen Workarounds für schreckliche wpf Webbrowser, musste sie so rückgängig machen, und würde lieber nichts zur Registrierung als App extern verwendet werden. –

+0

Ich konnte CKEditor 4.5.x mit solchen Host sorgenfrei verwenden. Beachten Sie, dass es an HKCU schreibt, daher sind keine Administratorrechte erforderlich. Kann jedoch nicht von späteren CKEditor-Versionen erzählen. – Noseratio

Antwort

1

Ich denke, ich weiß, was los ist, verwenden Sie NavigateToString, die eine about:blank Seite produziert. Dies wird nicht mit CKEditor funktionieren, wie eine file:// -basierte Editor-Host-Seite. Sie benötigen eine echte http/https -basierte Seite, die als Referenzierung CKEditor von ihrem CDN kann so einfach sein (ein sehr zuverlässiges Amazon gehosteten eins):

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8"> 
     <title>CKEditor</title> 
     <script src="https://cdn.ckeditor.com/4.7.1/standard/ckeditor.js"></script> 
    </head> 
    <body> 
     <textarea name="editor1"></textarea> 
     <script> 
      CKEDITOR.replace('editor1'); 
     </script> 
    </body> 
</html> 

Unten ist einfaches Beispiel Laden CKEditor Standard Editor Example in eine WPF WebBrowser Kontrolle es funktioniert ohne Probleme für mich.

Wenn Sie keine eigene dedizierte Online-Seite zum Hosten von CKEditor haben können, müssen Sie möglicherweise einen In-App-Einzelseiten-Webserver ausführen, um ihn über http://localhost zu bedienen. Es gibt viele Beispiele dafür (z. B. this one).

using Microsoft.Win32; 
using System; 
using System.Diagnostics; 
using System.Windows; 
using System.Windows.Controls; 

namespace WpfWebEditor 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     WebBrowser _webBrowser; 

     static MainWindow() 
     { 
      var fileName = System.IO.Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName); 
      SetBrowserFeatureControlKey("FEATURE_BROWSER_EMULATION", fileName, GetBrowserEmulationMode()); 
     } 

     public MainWindow() 
     { 
      InitializeComponent(); 
      this.Loaded += MainWindow_Loaded; 

      _webBrowser = new WebBrowser(); 
      this.Content = _webBrowser; 
     } 

     private void MainWindow_Loaded(object sender, RoutedEventArgs e) 
     { 
      _webBrowser.Navigate("https://nightly.ckeditor.com/standard/samples/"); 
     } 

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

     private static 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; 
     } 
    } 
} 
+1

Prost, das funktioniert tatsächlich, obwohl es keine Einstellung von Browserfunktionen erfordert (obwohl ich sehen kann, wie dies hilfreich sein kann. Hebt lokale HTTP-Seiten nicht an. Dasselbe kann durch Erstellen eines neuen URI auf der lokalen HTML-Seite und Navigieren zu erreicht werden Ich denke darüber nach, ob ich eine Antwort schreiben oder deine annehmen soll, ohne dass ich das jemals gedacht hätte. –

+0

@AistisTaraskevicius, ich bin froh zu wissen, dass es gegen eine 'file: // "Ich glaube nicht, dass es ein paar CKE-Iterationen gemacht hat, ich bin mir sicher, dass wir das ausprobiert haben. Wie auch immer, zögern Sie nicht, eine detaillierte Antwort zu veröffentlichen, damit andere davon profitieren können." – Noseratio