2017-01-21 6 views
0

Ich versuche, eine Website-URL mit RegisterJsObject in einer von zwei cefsharp-Instanzen zu laden. Die URL wird von der Website (chromeBrowser1) empfangen, jedoch wird das Fenster nicht aktualisiert (chromeBrowser2). Ich habe versucht, das Skript so gut wie möglich zu dokumentieren, damit es leichter zu verstehen ist. Ich bin mir ziemlich sicher, dass jemand mit Allgemeinkenntnissen in C# mein Problem finden wird, ich verbringe Stunden damit, eine Lösung zu finden, aber ich konnte es einfach nicht.Die Website kann nicht in CefSharp geladen werden.

 private void Form1_Load(object sender, EventArgs e) 
    { 
     CefSettings settings = new CefSettings(); 
     Cef.Initialize(settings); 

     chromeBrowser2 = new ChromiumWebBrowser("http://google.com") // Initializate Browser 2 FIRST (This is the instance we want to update every X seconds using chromeBrowser2.Load("http://somewebsite.com"); later on) 
     { 
      Dock = DockStyle.Fill, 

     }; 
     splitContainer1.Panel2.Controls.Add(chromeBrowser2); 



     chromeBrowser1 = new ChromiumWebBrowser("http://127.0.0.1/") // Initializate Browser 1 - Main website - source of data and more 
     { 
      Dock = DockStyle.Fill, 

     }; 
     splitContainer1.Panel1.Controls.Add(chromeBrowser1); 
     chromeBrowser1.RegisterJsObject("callbackObj", new CallbackObjectForJs()); /// the link is obtained from here - See picture 
    } 

    public class CallbackObjectForJs 
    { 
     private readonly static BackgroundWorker backgroundWorker1 = new BackgroundWorker(); 
     private readonly static ChromiumWebBrowser chromeBrowser2 = new ChromiumWebBrowser("http://facebook.com"); 
     // IF I REMOVE ANY OF THE ABOVE I WILL RECEIVE THE FOLLOWING ERROR : 
     // Error CS0120 An object reference is required for the non-static field, method, or property 'Form1.backgroundWorker1' 
     // Error CS0120 An object reference is required for the non-static field, method, or property 'Form1.chromeBrowser2' 
     public void showMessage(string msg) 
     { 

      var sitelink = msg; 

      Console.WriteLine(sitelink); // WORKING - link is visible on console but chromeBrowser 2 is not update, still reads http://google.com 
      Console.WriteLine("Loading site using one of the options below"); // Can be seen on console + 

      // AT THIS POINT chromeBrowser2 SHOULD LOAD THE NEW URL /// 

      chromeBrowser2.Load(sitelink); // NOT WORKING 
      Console.WriteLine("Check Point 1"); 
      backgroundWorker1.RunWorkerAsync(sitelink); // NOT WORKING 
      Console.WriteLine("Check Point 2"); 


     } 

    }  

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) // NOT WORKING 
    { 

     Console.WriteLine("Background Worker"); // Nothing 
     string link = (string)e.Argument; 
     Console.WriteLine("Check Point 3"); 
     chromeBrowser2.Load(link); 
     Console.WriteLine("Check Point 5"); 
     Console.WriteLine(link); 
     Console.WriteLine("Check Point 6"); 

    } 

This is what the console shows Console Ergebnisse.

Ich verstehe, dass aus irgendeinem Grund keine der Optionen, die ich gewählt habe, ausgelöst werden. Ich habe hohe Spekulationen, die auf Fehler CS0120 zurückzuführen sind, den ich verstecken konnte, indem ich sie statisch machte, aber das war's ziemlich. Ich habe keine Ideen mehr. Suchergebnisse haben mich soweit gebracht.

+1

Haben Sie versucht, die Address-Eigenschaft auf dem Chromium-Browser-Objekt zu setzen? –

+0

Ehrlich gesagt bin ich mir nicht sicher, was du damit meinst. Wenn du meinst, wenn ich eine Standard-URL setze, dann habe ich es getan. Dies ist auch das vollständige Skript. Alles, was ich getan habe, ist genau dort. – rgerculy

+0

Ich sehe, was Sie jetzt meinen, ChromiumWebBrowser.Address Property. Nein, habe ich nicht. Aber ich werde es jetzt tun, um zu sehen, ob es etwas offenbart. – rgerculy

Antwort

0

Ich installierte ReSharper und es fand das Problem in weniger als einer Minute. Alles, was ich tun musste, ist chromeBrowser2 statisch zu machen.

public partial class Form1 : Form 
    { 

    public ChromiumWebBrowser chromeBrowser1; 
    public *static* ChromiumWebBrowser chromeBrowser2; 
    .... 

Danke für jede Eingabe.

+1

Sie sollten einen Verweis an den Konstruktor Ihrer registrierten Klasse übergeben, wodurch die Instanziierung der Instanz funktioniert. Dies ist alles andere als "Best Practice". – amaitland

+0

Ich werde das überprüfen, aber die Anwendung ist so ziemlich. Es gibt keine anderen Aufgaben dafür. Alles andere wird in PHP verarbeitet. – rgerculy

Verwandte Themen