2009-08-17 19 views
12

¿Alguien sabe cómo hacer clic en un enlace en el control WebBrowser en una aplicación de WinForms y luego tener ese enlace abierto en una nueva pestaña dentro de mi TabControl?Abrir enlace en TAB nueva (control WebBrowser)

He estado buscando durante meses, he visto muchos tutoriales/artículos/muestras de código pero parece que nadie ha intentado esto en C# antes.

Cualquier consejo/muestras son muy apreciadas.

Gracias.

+0

Soy alguien más que tiene problemas con, por ejemplo, abrir cada vez que hago clic en un enlace de página web dentro mi propio navegador Intenté todo lo anterior pero no tuve suerte, la primera respuesta de Robert Agregué ExtendedWebBrowser en modo de diseño, pero sigo obteniendo la línea roja debajo (InitialTabBrowser) en la última línea de código, y la advertencia de 'InitialTabBroswer no existir en el contexto actual '. Cualquier otro consejo/consejos sería genial. –

Respuesta

25

Sobre la base de sus comentarios, entiendo que desea controlar la "Abrir en ventana nueva" acción para el control WebBrowser y redefinir el comportamiento por defecto para abrir en una nueva pestaña dentro de su aplicación en su lugar.

Para lograr esto de forma confiable, debe obtener en el evento NewWindow2, que expone ppDisp (un puntero configurable para el control WebBrowser que debe abrir la nueva ventana). Todas las demás soluciones potenciales pirateadas juntas (como la obtención del último enlace seleccionado por el usuario antes del evento OpenWindow) no son óptimas y pueden fallar en casos de esquina.

Afortunadamente, hay una forma (relativamente) simple de lograr esto mientras se usa el control System.Windows.Forms.WebBrowser como base. Todo lo que necesita hacer es extender WebBrowser e interceptar el evento NewWindow2 mientras proporciona acceso público a la instancia de ActiveX (para pasar a ppDisp en pestañas nuevas). Esto se ha hecho antes, y Mauricio Rojas tiene un excelente ejemplo de una clase de trabajo completo "ExtendedWebBrowser":

http://blogs.artinsoft.net/mrojas/archive/2008/09/18/newwindow2-events-in-the-c-webbrowsercontrol.aspx

Una vez que tenga la clase ExtendedWebBrowser, todo lo que necesita hacer es manejadores de configuración para NewWindow2 y el punto ppDisp a un navegador en una nueva pestaña. He aquí un ejemplo que puse juntos:

private void InitializeBrowserEvents(ExtendedWebBrowser SourceBrowser) 
    { 
     SourceBrowser.NewWindow2 += new EventHandler<NewWindow2EventArgs>(SourceBrowser_NewWindow2); 
    } 

    void SourceBrowser_NewWindow2(object sender, NewWindow2EventArgs e) 
    { 

     TabPage NewTabPage = new TabPage() 
     { 
      Text = "Loading..." 
     }; 

     ExtendedWebBrowser NewTabBrowser = new ExtendedWebBrowser() 
     { 
      Parent = NewTabPage, 
      Dock = DockStyle.Fill, 
      Tag = NewTabPage 
     }; 

     e.PPDisp = NewTabBrowser.Application; 
     InitializeBrowserEvents(NewTabBrowser); 

     Tabs.TabPages.Add(NewTabPage); 
     Tabs.SelectedTab = NewTabPage; 

    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

     InitializeBrowserEvents(InitialTabBrowser); 

    } 

(Asume TabControl nombrado "aquí" y la ficha inicial de control que contiene niño atracado ExtendedWebBrowser nombrado "InitialWebBrowser")

No se olvide de cancelar el registro de los eventos cuando las pestañas ¡esta cerrado!

+0

Muchas gracias Robert por la código de muestra y el enlace :-) Tengo un par de preguntas, agregué una clase y la llamé ExtendedWebBrowser.cs y luego agregué su código de muestra al archivo Form1.cs y me da el siguiente error cuando intento depurar : "Argumento '1' no se puede convertir de 'System.Windows.Forms.WebBrowser a' ExtendedWebBrowser '." Y la línea azul squigly aparece debajo de la siguiente línea de código: InitializeBrowserEvents (InitialTabBrowser); ¿Sabes qué es eso? –

+1

Asegúrate de que InitialWebBrowser es del tipo "ExtendedWebBrowser": parece que aún utilizas el "WebBrowser". Para agregar ExtendedWebBrowser, busque en su caja de herramientas. Debería verlo hacia la parte superior con un pequeño símbolo de engranaje al lado. Esto es lo que debe agregar a su formulario en modo de diseño para el control InitialWebBrowser. –

+0

muchas gracias por este Robert. Has sido muy útil. :) –

4
private Uri _MyUrl;  

System.Windows.Forms.WebBrowser browser = new System.Windows.Forms.WebBrowser(); 
browser.Navigating += new System.Windows.Forms.WebBrowserNavigatingEventHandler(browser_Navigating); 


void browser_Navigating(object sender, System.Windows.Forms.WebBrowserNavigatingEventArgs e) 
{ 
    _MyUrl = e.Url; 
    e.Cancel; 
} 
+0

Gracias, fue muy útil, aunque estoy tratando de obtener la URL que se envía a la nueva ventana del navegador para que pueda detener la apertura del nuevo navegador y abrir esa URL en una nueva pestaña en mi propio navegador. Por ejemplo, cuando hago clic con el botón derecho en un enlace y selecciono Abrir en una ventana nueva, no quiero que se abra en un nuevo IE. Quiero que se abra en una pestaña nueva en mi navegador web. –

+1

Quizás pueda anular el ContextMenu para el El botón "Abrir en una ventana nueva". Nunca he hecho algo así antes. ¡Buena suerte! – sshow

+0

Gracias sshow si tengo éxito publicaré el código para todos en caso de que les gustaría saber, ya que nunca he visto a nadie hacer esto en cualquier lugar de la web en C# antes ... –

-2

No hay tabulaciones en el control del navegador web, por lo que debe manejar las pestañas usted mismo. Agregue un control de ficha sobre el control del navegador web y cree nuevos controles de navegador web cuando se abran nuevas pestañas. Capture y cancele cuando el usuario abra ventanas nuevas y abra pestañas nuevas.

3

El siguiente código funciona, simplemente siga la primera respuesta para crear la clase ExtendedWebBrowser.

Estoy usando esto para abrir una nueva pestaña, pero también funciona para abrir una nueva ventana con su navegador y no con IE.

Espero que ayude.

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (current_tab_count == 10) return; 
     TabPage tabPage = new TabPage("Loading..."); 
     tabpages.Add(tabPage); 
     tabControl1.TabPages.Add(tabPage); 
     current_tab_count++; 
     ExtendedWebBrowser browser = new ExtendedWebBrowser(); 
     InitializeBrowserEvents(browser); 
     webpages.Add(browser); 
     browser.Parent = tabPage; 
     browser.Dock = DockStyle.Fill; 
     browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted); 
     browser.DocumentTitleChanged += new EventHandler(Browser_DocumentTitleChanged); 
     browser.Navigated += Browser_Navigated; 
     browser.IsWebBrowserContextMenuEnabled = true; 
public void InitializeBrowserEvents(ExtendedWebBrowser browser) 
    { 
     browser.NewWindow2 += new EventHandler<ExtendedWebBrowser.NewWindow2EventArgs>(Browser_NewWindow2); 
    } 

    void Browser_NewWindow2(object sender, ExtendedWebBrowser.NewWindow2EventArgs e) 
    { 

     if (current_tab_count == 10) return; 
     TabPage tabPage = new TabPage("Loading..."); 
     tabpages.Add(tabPage); 
     tabControl1.TabPages.Add(tabPage); 
     current_tab_count++; 
     ExtendedWebBrowser browser = new ExtendedWebBrowser(); 
     webpages.Add(browser); 
     browser.Parent = tabPage; 
     browser.Dock = DockStyle.Fill; 
     browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted); 
     browser.DocumentTitleChanged += new EventHandler(Browser_DocumentTitleChanged); 
     browser.Navigated += Browser_Navigated; 
     tabControl1.SelectedTab = tabPage; 
     browser.Navigate(textBox.Text); 

     { 
      e.PPDisp = browser.Application; 
      InitializeBrowserEvents(browser); 
     } 
+0

Muchas gracias, MUY mucho Dev. El código funciona perfectamente, ¡eres increíble! Muchas gracias amigo. : D –

3

lo hice un poco de investigación sobre este tema y uno no tiene que hacer todas las cañerías COM que está presente en la clase ExtendedWebBrowser, ya que el código ya está presente en el Interop.SHDocVw generado. Como tal, pude usar el constructo más natural a continuación para suscribirme al evento NewWindow2. En Visual Studio tuve que agregar una referencia a "Microsoft Internet Controls".

using SHDocVw; 
    ... 

    internal WebBrowserSsoHost(System.Windows.Forms.WebBrowser webBrowser,...) 
    { 
     ParameterHelper.ThrowOnNull(webBrowser, "webBrowser"); 
     ... 

     (webBrowser.ActiveXInstance as WebBrowser).NewWindow2 += OnNewWindow2; 
    } 

    private void OnNewWindow2(ref object ppDisp, ref bool Cancel) 
    { 
     MyTabPage tabPage = TabPageFactory.CreateNewTabPage(); 
     tabPage.SetBrowserAsContent(out ppDisp); 
    } 

Lea http://bit.ly/IDWm5A para obtener más información. Esta es la página 5 de la serie, para una comprensión completa tuve que volver y leer las páginas 3 -> 5.

+0

¿Qué es todo esto? ¿Cómo usarlo? – Kosmos

Cuestiones relacionadas