2017-05-05 8 views
2

Je travaille pour la première fois avec GeckoFX. J'ai cherché partout mais il n'y a pas répondu à des questions à ce sujet.Navigateur GeckoFX - Contrôle nouvelle fenêtre

J'essaie d'ajouter un écouteur DocumentCompleted sur une nouvelle fenêtre qui apparaît après avoir cliqué sur href avec cible vide

<a href='newWindow.html' target='_blank'>Click here</a> 

GeckoFX crée une nouvelle fenêtre et il apparaît, mais je ne peux pas obtenir contrôle sur la nouvelle fenêtre WebBrowser événements.

J'ai essayé de faire quelque chose comme

private void browser_CreateWindow(object sender, Gecko.GeckoCreateWindowEventArgs e) 
    { 
     e.WebBrowser.DocumentCompleted += WebBrowser_DocumentCompleted; 
    } 

    private void WebBrowser_DocumentCompleted(object sender, GeckoDocumentCompletedEventArgs e) 
    { 
     MessageBox.Show("Document Completed!"); 
    } 

mais e.WebBrowser est toujours nulle.

+0

Cela peut être long, mais avez-vous essayé l'événement browser.CreateWindow2? Il a un objet différent args d'objet donc peut-être ... – Bartosz

Répondre

0

la réponse originale est here, mais je le coller dans le lien de cas meurt etc.

Disons que c'est vous formez:

public partial class MainForm: Form 
{ 
    public MainForm() 
    { 
     InitializeComponent(); 

     WindowWatcher.WindowCreator = new TabbedBrowserCreator(this); 
     WindowWatcher.LockWindowCreator(); 

     gwBrowser.DocumentTitleChanged += gwBrowser_DocumentTitleChanged; 
     gwBrowser.DocumentCompleted += gwBrowser_DocumentCompleted; 

     gwBrowser.Navigate("http://www.popuptest.com/"); 
    } 

    void gwBrowser_DocumentTitleChanged(object sender, EventArgs e) 
    { 
     tabPageMain.Text = gwBrowser.DocumentTitle; 
    } 

    void gwBrowser_DocumentCompleted(object sender, EventArgs e) 
    { 
     // Some work on document completed 
    } 

    internal nsIWebBrowserChrome AddNewTab() 
    { 
     GeckoWebBrowser gwBrowserTab = new GeckoWebBrowser(); 
     gwBrowserTab.DocumentTitleChanged += gwBrowserTab_DocumentTitleChanged; 
     gwBrowserTab.DocumentCompleted += gwBrowserTab_DocumentCompleted; 

     TabPage oTabPage = new TabPage("New Tab"); 
     Padding oPadding = oTabPage.Margin; oPadding.All = 0; 
     oPadding = oTabPage.Padding; oPadding.All = 0; 
     oTabPage.Controls.Add(gwBrowserTab); 

     gwBrowserTab.Dock = DockStyle.Fill; 

     tabControlMain.TabPages.Add(oTabPage); 

     return gwBrowserTab; 
    } 

    private void gwBrowserTab_DocumentTitleChanged(object sender, EventArgs e) 
    { 
     GeckoWebBrowser gwBrowserTab = sender as GeckoWebBrowser; 
     if (gwBrowserTab == null) return; 

     TabPage oTabPage = gwBrowserTab.Parent as TabPage; 
     if (oTabPage == null) return; 

     oTabPage.Text = gwBrowserTab.DocumentTitle; 
    } 

    private void gwBrowserTab_DocumentCompleted(object sender, EventArgs e) 
    { 
     GeckoWebBrowser gwBrowserTab = sender as GeckoWebBrowser; 
     if (gwBrowserTab == null) return; 

     TabPage oTabPage = gwBrowserTab.Parent as TabPage; 
     if (oTabPage == null) return; 

     tabControlMain.SelectedTab = oTabPage; 
    } 
} 

Et l'élément clé, des fenêtres personnalisées créateur:

public sealed class TabbedBrowserCreator: nsIWindowCreator2 
{ 
    private MainForm m_Parent; 

    public TabbedBrowserCreator(MainForm p_Parent) 
    { 
     m_Parent = p_Parent; 
    } 

    nsIWebBrowserChrome nsIWindowCreator2.CreateChromeWindow(nsIWebBrowserChrome parent, uint chromeFlags) 
    { 
     bool bCancel = false; 
     return CreateWindow(parent, chromeFlags, 0, null, ref bCancel); 
    } 

    nsIWebBrowserChrome nsIWindowCreator2.CreateChromeWindow2(nsIWebBrowserChrome parent, uint chromeFlags, uint contextFlags, nsIURI uri, ref bool cancel) 
    { 
     return CreateWindow(parent, chromeFlags, contextFlags, uri, ref cancel); 
    } 

    nsIWebBrowserChrome nsIWindowCreator.CreateChromeWindow(nsIWebBrowserChrome parent, uint chromeFlags) 
    { 

     bool cancel = false; 
     return CreateWindow(parent, chromeFlags, 0, null, ref cancel); 
    } 

    private nsIWebBrowserChrome CreateWindow(nsIWebBrowserChrome parent, uint chromeFlags, uint contextFlags, nsIURI uri, ref bool cancel) 
    { 
     GeckoWindowFlags flags = (GeckoWindowFlags)chromeFlags; 

     if ((flags & GeckoWindowFlags.OpenAsChrome) != 0) 
     { 
      // create the child window 
      nsIXULWindow xulChild = AppShellService.CreateTopLevelWindow(null, null, chromeFlags, -1, -1); 

      // this little gem allows the GeckoWebBrowser to be properly activated when it gains the focus again 
      if (parent is GeckoWebBrowser && (flags & GeckoWindowFlags.OpenAsDialog) != 0) 
      { 
       EventHandler gotFocus = null; 
       gotFocus = delegate(object sender, EventArgs e) 
       { 
        var br = (sender as GeckoWebBrowser); 
        if (br != null) 
        { 
         br.GotFocus -= gotFocus; 
         br.WebBrowserFocus.Activate(); 
        } 

       }; 
       var parBr = parent as GeckoWebBrowser; 
       parBr.GotFocus += gotFocus; 
      } 

      // return the chrome 
      return Xpcom.QueryInterface<nsIWebBrowserChrome>(xulChild); 
     } 

     nsIWebBrowserChrome oBrowser = m_Parent.AddNewTab(); 
     oBrowser.SetChromeFlagsAttribute(chromeFlags); 
     return oBrowser; 
    } 
} 

Espérons que cela aide. Cheers