2015-05-31 9 views
8

Ich erstelle einen Registerkarten-Web-Browser mit CefSharp 39.0.2. Wenn der Benutzer gerade auf einen Link auf einer Website klickt, wird ein neues Fenster geöffnet, das nicht über meine ursprüngliche Benutzeroberfläche verfügt. Wenn Sie zum Beispiel auf einen Artikel-Link in Google News klicken, wird dieser in einem neuen Fenster geöffnet, jedoch ohne die von mir erstellten Browser-Steuerelemente. Ich schaute auch in das Cef.WinForms.Example Programm, und es macht genau das gleiche.Umgang mit Popup-Links in CefSharp

Kann man das anders handhaben? Ich möchte, dass der Link entweder in einem neuen Tab geöffnet oder in einem neuen Fenster geöffnet wird (mit allen darin enthaltenen Steuerelementen). Ich habe die GitHub-Ausgaben durchgesehen, und ich konnte so etwas nicht finden (vielleicht habe ich nicht intensiv genug gesucht, weil ich denke, dass das auch andere tun wollen ...). Ich schaute durch alle events für die Browser-Kontrolle, und ich konnte keine finden, die scheinen, als ob sie damit umgehen.

Antwort

12

ChromiumWebBrowser hat eine LifeSpanHandler Eigenschaft. Um Popup-Fenster in Cefsharp manuell zu steuern, müssen Sie Ihr eigenes Lebensdauer-Handler-Objekt implementieren, das die Schnittstelle ILifeSpanHandle implementiert.

Jedes Mal, wenn der Browser ein neues Fenster öffnen möchte, ruft er die Funktion Ihres Life-Handlers auf. Hier können Sie Ihr gewünschtes Verhalten implementieren. Wenn Sie false zurückgeben, öffnet der Browser ein neues Fenster. Wenn Sie true zurückgeben, ignoriert der Browser die Popup-Aktion, aber Sie können Ihr neues Fenster, die neue Registerkarte usw. manuell erstellen.

Dies ist ein sehr einfaches Beispiel für benutzerdefinierte Lebensdauer-Handler. Bei einer Popup-Anfrage wird ein Ereignis namens PopupRequest ausgelöst. Sie können ein solches Ereignis abonnieren und ein neues Fenster/Tab manuell erstellen. Dann gibt es true zurück, das ChromiumWebBrowser anweist, kein eigenes neues Fenster zu erstellen. Sie müssen jedoch das Erstellen eines neuen Fensters mit einem anderen ChromiumWebBrowser auf eigene Faust implementieren.

public class SampleLifeSpanHandler: ILifeSpanHandler 
{ 
    public event Action<string> PopupRequest; 

    public bool OnBeforePopup(IWebBrowser browser, string sourceUrl, string targetUrl, ref int x, ref int y, ref int width, 
     ref int height) 
    { 
     if (PopupRequest != null) 
      PopupRequest(targetUrl); 

     return true; 
    } 

    public void OnBeforeClose(IWebBrowser browser) 
    { 

    } 
} 
+0

Oh vielen vielen Dank. Du bist ein großartiger Mann –