2017-05-05 117 views
2

我正在第一次與GeckoFX。 我到處搜索,但沒有回答有關它的問題。GeckoFX瀏覽器 - 控制新窗口

我想上點擊HREF空白目標後,會彈出一個新窗口中添加DocumentCompleted聽衆

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

GeckoFX創建一個新的窗口,並彈出它,但我不能讓控制新窗口WebBrowser事件。

我試着做一些像

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!"); 
    } 

e.WebBrowser總是空。

+0

這可能是一個長鏡頭,但您是否嘗試過browser.CreateWindow2事件?它有一個不同的事件參數對象,所以也許... – Bartosz

回答

0

原來答案是here,但我把它粘貼在鏈接的情況下死亡等

比方說,那是你形成:

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; 
    } 
} 

而事情的關鍵,自定義窗口的創建者:

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; 
    } 
} 

希望這會有所幫助。 乾杯