2009-08-17 20 views
12

Czy ktoś wie, jak kliknąć łącze w formancie WebBrowser w aplikacji WinForms, a następnie otworzyć to łącze w nowej karcie w moim kontrolerze TabControl?Otwórz link w nowej TAB (WebBrowser Control)

Szukałem miesięcy, widziałem wiele samouczków/artykułów/próbek kodu, ale wygląda na to, że nikt wcześniej nie próbował tego w C#.

Każda rada/próbki są mile widziane.

Dziękuję.

+0

Jestem kimś, kto ma problemy z tj. Otwarciem za każdym razem, gdy klikam na link strony internetowej w ciągu moja własna przeglądarka. Próbowałem wszystkie powyższe, ale bez powodzenia, pierwsza odpowiedź Roberta Dodałem ExtendedWebBrowser w trybie projektowania, ale nadal otrzymuję czerwoną linię pod (InitialTabBrowser) na ostatnim wierszu kodu, a ostrzeżenie "InitialTabBroswer nie jest istnieją w obecnym kontekście ". Wszelkie dodatkowe porady/porady byłyby świetne. –

Odpowiedz

25

oparciu o komentarze, rozumiem, że chcesz do pułapki „Otwórz w nowym oknie” działań na rzecz kontroli WebBrowser i zastąpić domyślne zachowanie, aby otworzyć w nowej karcie wewnątrz aplikacji zamiast.

Aby to osiągnąć niezawodnie, musisz dostać się do zdarzenia NewWindow2, które ujawnia ppDisp (ustawiany wskaźnik do formantu WebBrowser, który powinien otworzyć nowe okno). Wszystkie inne potencjalne zhakowane rozwiązania (takie jak uzyskanie ostatniego linka wybranego przez użytkownika przed zdarzeniem OpenWindow) nie są optymalne i z pewnością zawiodą w przypadku narożników.

Na szczęście istnieje (stosunkowo) prosty sposób na osiągnięcie tego przy jednoczesnym użyciu kontrolki System.Windows.Forms.WebBrowser jako podstawy. Wszystko, co musisz zrobić, to rozszerzenie WebBrowser i przechwycenie zdarzenia NewWindow2 przy jednoczesnym zapewnieniu publicznego dostępu do instancji ActiveX (za przejście do ppDisp w nowych kartach). Zostało to zrobione wcześniej, a Mauricio Rojas ma doskonały przykład z kompletnym robotniczej „ExtendedWebBrowser”:

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

Gdy masz klasę ExtendedWebBrowser, wszystko co musisz zrobić, to koparki ustawień dla NewWindow2 a punktem ppDisp do przeglądarki w nowej karcie. Oto przykład, że ułożyła:

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

    } 

(Zakłada TabControl nazwie „Karty” i zakładka wstępna kontrola zawierający dziecko zadokowany ExtendedWebBrowser nazwie „InitialWebBrowser”)

Nie zapomnij wyrejestrować wydarzeń kiedy wypustki są zamknięte!

+0

Bardzo dziękuję Robertowi za przykładowy kod i link :-) Mam kilka pytań, dodałem klasę i nazwał ją ExtendedWebBrowser.cs, a następnie dodałem twój przykładowy kod do pliku Form1.cs i pojawia się następujący błąd podczas próby debugowania : "Argument" 1 "nie może konwertować z" System.Windows.Forms.WebBrowser na "ExtendedWebBrowser". " Niebieska liniowa linia pojawia się poniżej następującego wiersza kodu: InitializeBrowserEvents (InitialTabBrowser); Czy wiesz co to jest? –

+1

Upewnij się, że InitialWebBrowser jest typu "ExtendedWebBrowser" - Wygląda na to, że nadal używasz "WebBrowser". Aby dodać ExtendedWebBrowser, zajrzyj do swojego zestawu narzędzi. Powinieneś zobaczyć go na górze z małym symbolem koła zębatego obok niego. To właśnie powinieneś dodać do swojego formularza w trybie projektowania kontrolki InitialWebBrowser. –

+0

dziękuję bardzo za tego Roberta. Byłeś bardzo pomocny. :) –

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

Dziękuję sshow, to było bardzo pomocne, ale próbuję uzyskać adres URL, który jest wysyłany do nowego okna przeglądarki, tak, że mogę zatrzymać otwarcie nowej przeglądarki i po prostu otworzyć ten URL w nowej karcie w mojej przeglądarce? Na przykład, gdy kliknę prawym przyciskiem myszy link i wybieram Otwórz w nowym oknie, nie chcę, aby był on otwierany w nowym IE, chcę go otworzyć w nowej zakładce w mojej przeglądarce internetowej –

+1

Może można zastąpić ContextMenu dla Przycisk "Otwórz w nowym oknie". Nigdy wcześniej czegoś takiego nie robiłem. Powodzenia! – sshow

+0

Dziękuję sshow, jeśli mi się powiedzie, opublikuję kod dla wszystkich, którzy chcieliby wiedzieć, ponieważ nigdy nie widziałem nikogo, kto to zrobiłby w Internecie w języku C# przed ... –

-2

W przeglądarce internetowej nie ma zakładki, dlatego musisz samodzielnie obsługiwać karty. Dodaj kontrolkę zakładki nad kontrolką przeglądarki i utwórz nowe elementy sterujące przeglądarki podczas otwierania nowych kart. Złap i anuluj, gdy użytkownik otworzy nowe okna i otworzy nowe karty.

3

Poniższy kod działa, wystarczy postępować zgodnie z pierwszą odpowiedzią dotyczącą utworzenia klasy ExtendedWebBrowser.

Używam tego, aby otworzyć nową kartę, ale działa również, aby otworzyć nowe okno przy użyciu przeglądarki, a nie IE.

Mam nadzieję, że to pomaga.

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

Dziękuję bardzo, BARDZO Dev. Kod działa idealnie, jesteś niesamowity! Wielkie dzięki. : D –

3

zrobiłem trochę badań na ten temat i nie trzeba robić wszystko kanalizacji COM, który jest obecny w klasie ExtendedWebBrowser, jako że kod jest już obecny w wygenerowanym Interop.SHDocVw. W związku z tym mogłem użyć bardziej naturalnego konstruktora poniżej, aby subskrybować wydarzenie NewWindow2. W Visual Studio musiałem dodać odniesienie do "Microsoft Internet Controls".Aby uzyskać więcej informacji, należy przeczytać http://bit.ly/IDWm5A. To jest strona 5 w serii, dla pełnego zrozumienia musiałem wrócić i przeczytać strony 3 -> 5.

+0

Co to jest? Jak tego użyć? – Kosmos

Powiązane problemy