2017-05-05 15 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 같은 일을 시도하는 것은 항상 null입니다.

+0

길게 찍었을 수도 있지만 browser.CreateWindow2 이벤트를 시도 했습니까? 그것은 아마도 다른 이벤트 args 객체를 가지고 있습니다. 아마도 ... – 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; 
    } 
} 

희망이 있습니다. 건배