Cómo evitar que los enlaces de destino en blank (target blank) se abran en una nueva ventana (ventanas emergentes) en Cefsharp

Cómo evitar que los enlaces de destino en blank (target blank) se abran en una nueva ventana (ventanas emergentes) en Cefsharp

De forma predeterminada en Cefsharp, cuando navegas a una página web que contiene enlaces que se inician en una nueva ventana (target = _blank), el HTML de ese enlace se ve así:

<a href="https://ourcodeworld.com" target="_blank">
    Lanzar Our Code World en Ingles
</a>

Entonces, cuando el usuario hace clic en el enlace cuando se ejecuta en CefSharp, se abrirá una nueva ventana:

CefSharp new Window

Si controlas el marcado de la página que está visitando, simplemente puedes eliminar el atributo target=_blank de los enlaces, sin embargo, la forma más óptima de evitar que esto suceda es a través de LifeSpanHandler (considerando que tu necesidad es forzar que cada enlace deba abrirse en la misma instancia inicial del navegador, en este caso, Form1).

1. Crea una clase LifeSpanHandler personalizada

Como primer paso para evitar que suceda el comportamiento predeterminado, es crear una nueva clase en tu proyecto. Esta clase anulará el comportamiento de la clase LifeSpanHandler de CefSharp. El contenido de la clase es el siguiente, simplemente puedes copiar su contenido y agregarlo a tu proyecto. El método importante en esta clase es el método OnBeforePopup que se activa cuando el usuario hace clic en los enlaces que aparecerán como Popups, con la instrucción dada, la nueva URL aparecerá ahora en el mismo navegador (Form1), en lugar de abrir uno nuevo. Los otros métodos (DoClose, OnAfterCreated, OnBeforeClose) también deben declararse o encontrará una excepción con la interfaz:

// MyCustomLifeSpanHandler.cs
using CefSharp;

namespace CefsharpSandbox
{
    public class MyCustomLifeSpanHandler : ILifeSpanHandler
    {
        // Carga la nueva URL (al hacer clic en un enlace con target = _blank) en el mismo marco
        public bool OnBeforePopup(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
        {
            browser.MainFrame.LoadUrl(targetUrl);
            newBrowser = null;
            return true;
        }

        // Si no implementa todos los miembros de la interfaz en la clase personalizada
        // encontraras:
        // Error CS0535	'MyCustomLifeSpanHandler' does not implement interface member 'ILifeSpanHandler.OnAfterCreated(IWebBrowser, IBrowser)'

        public bool DoClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
        {
            // throw new NotImplementedException();
            return true;
        }

        public void OnAfterCreated(IWebBrowser chromiumWebBrowser, IBrowser browser)
        {
            // throw new NotImplementedException();
        }

        public void OnBeforeClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
        {
            // throw new NotImplementedException();
        }
    }
}

2. Obligar a CefSharp a utilizar el LifeSpanHandler personalizado

Una vez que se ha creado la clase y está disponible en su proyecto, solo necesitas establecer el valor de la propiedad LifeSpanHandler de tu ChromiumWebBrowser como una nueva instancia de tu controlador de duración personalizado. Esto se puede lograr durante la creación del navegador en tu código actual, por ejemplo:

CefSettings settings = new CefSettings();
// Algunas configuraciones si las tienes, aquí
// Inicializar cef con la configuración proporcionada
Cef.Initialize(settings);

// Crear un componente de navegador
ChromiumWebBrowser chromeBrowser = new ChromiumWebBrowser("https://ourcodeworld.co");
// Registra tu LifeSpanHandler personalizado
chromeBrowser.LifeSpanHandler = new MyCustomLifeSpanHandler();

// ...
// Resto de tu código
// ...

Inicializa tu proyecto e intenta hacer clic una vez más en los enlaces que solían abrir una nueva ventana en tu componente CefSharp, ahora deberían abrirse en la misma ventana en la que estás trabajando en lugar de en una nueva.

Que te diviertas ❤️!

Esto podria interesarte

Conviertete en un programador más sociable