C# webKitbrpwser, tabcontrol, event

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by eregis, 15 Jul 2012.

  1. eregis

    eregis Member

    Joined:
    15 Jul 2010
    Messages:
    104
    Likes Received:
    5
    Reputations:
    -5
    Есть форма на ней tabcontrol и webkitbrowser
    как можно реализировать возможность открытия новой табы и там переход по ссылке которая имеет вид
    Code:
    http://
    Простыми словами: сделать возможность открытия ссылки в новой вкладке. Прошу вас написать событие, или подскажите в какую сторону копать.
    И если возможно, то подскажите как прикрутить progressbar к webkitbrowser ??



    Заранее благодарен..
     
  2. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Я как раз недавно эксперементировал с готовым сишарповским браузером. И так, что нам надо:

    Code:
    public ObservableCollection<TabItem> MyColl { get; set; }//Создаём коллекцию вкладок.
    List<WebBrowser> BrowserList = new List<WebBrowser>();//Создаём список веббраузеров, для использования кадлой новой ссылки, будем добавлять новый браузер.
    //Так же нам нужна переменная типа Uri(я создавал глобальную propdp, но это мне надо было для специфическойго действия, а так можно взять List<Uri> )
    //Сверху над tabcontrol  я бросил TextBox, то есть типо адресной строки(хотя на самом деле лучше зделать, наверное, ComboBox, если хочешь сделать выпадающий список при наборе адреса, но мне это было не нужно, я ии не замарачивался.)
    //Инициировал я префикс как то так:
     internal static void WritePrefixUri(TextBox UriTextBox)
            {
                UriTextBox.Text = UriTextBox.Text == "http://www." ? "https://" : "http://www.";
                UriTextBox.CaretIndex = UriTextBox.Text.Length;
            }
    
      if (UrlLine.Text.Replace(" ", "") != null)
                        {
                            //progressBar1.BindingGroup.BeginEdit();
                            progressBar1.IsIndeterminate = true;
                            TryOpenUri(UrlLine.Text, TabControlWeb.SelectedIndex);
                        }
    
    //Важная вещь - в браузер ури, надо передавать ссылку с префиксом, поэтому нужно корректировать адрес задаваемый в текст боксе :
            public void TryOpenUri(string GetUrlString, int CurrentTabIndex)
            {
                Uri Source;
    
                try
                {
                    if (GetUrlString.StartsWith("http://www.") || GetUrlString.StartsWith("https://www."))
                    {
                        MessageBox.Show("Standart Eingabe, keine Korrektur nötig.");
                         Source = new Uri(UrlLine.Text);
                         CurrentTabNavigation(Source);
                         
                       // WebBrowser.Navigate(Source);
                    }
                    else if (GetUrlString.StartsWith("www.") || GetUrlString.StartsWith("http://") || GetUrlString.StartsWith("https://"))
                    {
                        
                        MessageBox.Show("www. oder Http Eingabe");
                        if (!GetUrlString.StartsWith("https://"))
                        {
                             Source = GetUrlString.StartsWith("www.") ? new Uri("http://www." + GetUrlString.Substring(4))
                                                                         : new Uri("http://www." + GetUrlString.Substring(7));
    
                        }
                        else
                        {
                            Source = new Uri("https://" + GetUrlString.Substring(8));
                        }
                        CurrentTabNavigation(Source);
                       // WebBrowser.Navigate(Source);
    
                    }
                       
                    else
                    {
                        MessageBox.Show("URL- задан без префикса ");
                        Source = new Uri("http://www." + GetUrlString);
                      //  WebBrowser.Navigate(Source);
                        CurrentTabNavigation(Source);
                    }
                    textBox1.Text = Source.ToString();
                }
                    
                catch (Exception UriException)
                {
                    MessageBox.Show( "Внимание ошибка!Обратите внимание на причину возникновение!",UriException.Message, MessageBoxButton.OK, MessageBoxImage.Information);
                   Source = new Uri("https://www.google.com/search?q=" + GetUrlString);
                //    WebBrowser.Navigate(Source);
                   CurrentTabNavigation(Source);
                }
    
            }
    
    
    //Добавляем табы
     private void testLoad()
            {
                
                     WebBrowser browser = new WebBrowser();
                    // Uri myUri = new Uri("http://www.google.de");
                   //  browser.Navigate(CheckUri);
                        
               
                   browser.LoadCompleted +=
                            new LoadCompletedEventHandler(WebBrowser_LoadCompleted);
                BrowserList.Add(browser);
               TabItem item = new TabItem();
           
              
                     item.Header = "Новый таб"; //"Header "; //+ i.ToString();
                     item.Foreground = Brushes.Red;
                     item.Background = Brushes.AliceBlue;
                       
                     item.Content = BrowserList[BrowserList.Count - 1];
                    // MyColl.Add(item);
                   TabControlWeb.Items.Add(item);
                     TabControlWeb.SelectedItem = item;  
          
                  //   MessageBox.Show(TabControlWeb.Items.CurrentItem.ToString());
                
            }
    
    
    //Чековаем табы
    private void MenuItem_Click(object sender, RoutedEventArgs e)
            {
             
           
                var currentItem = (MenuItem)sender;
                
             //   MessageBox.Show(currentItem.PersistId.ToString());
            //   MessageBox.Show(cm.Items.IndexOf(currentItem).ToString());
                
                if (currentItem.IsChecked == true)
                {
                    
                    for (int i = 0; i < cm.Items.Count; i++)
                    {
                        MenuItem CheckThis = new MenuItem();
                        CheckThis =  (MenuItem) cm.Items.GetItemAt(i);
                        CheckThis.IsChecked = cm.Items.IndexOf(currentItem) != i ? false : true;
                           
                    }
                }
               
               
            }
    
    
    
    //Навигация
    
     private void GetStartTab(Uri DefaultStartUri)
            {
                WebBrowser browser = new WebBrowser();
                // Uri myUri = new Uri("http://www.google.de");
                browser.Navigate(DefaultStartUri);
                 browser.LoadCompleted +=
                   new LoadCompletedEventHandler(WebBrowser_LoadCompleted);
               BrowserList.Add(browser);
                
               //TabItem item = new TabItem();
               TabItem item = new TabItem();
                
                item.Header = "google.de"; //"Header "; //+ i.ToString();
              
                item.Content = BrowserList[BrowserList.Count - 1];
               // MyColl.Add(item);
                TabControlWeb.Items.Add(item);
                
    
            }
    
    Хочу уточнить, что это "грязный код" - черновик, комментарии удалять мне лень, метод GetStartTab - ацкий, задумывалась немного по другом, но в итоге напихал туда всего и не переназвал.
     
  3. eregis

    eregis Member

    Joined:
    15 Jul 2010
    Messages:
    104
    Likes Received:
    5
    Reputations:
    -5
    Не смог извлекти ничего полезного, подобие кода выше ужэ готово. Нужно то что выше написано.
     
  4. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    [Qoute]как можно реализировать возможность открытия новой табы и там переход по ссылке которая имеет вид[/Qoute]

    Может я чего то не понимаю?
    Добавление- открытие нового таба у меня описано в методе testLoad().
     
  5. eregis

    eregis Member

    Joined:
    15 Jul 2010
    Messages:
    104
    Likes Received:
    5
    Reputations:
    -5
    Смотри внимательно. Если ссылка вида
    Code:
    <a href='index.php?do=46466'></a>
    Переходя по ней браузер подгружает страницу и все. Если же ссылка вида :
    Code:
    <a href='http://google.com/index.php?do=46466'></a>
    То в браузере открывается новая вкладка и в ней ужэ открывается сторонний сайт.
     
  6. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Я читал внимательно, ты не правильно проблему описал.
    Вот тут есть решение, требуется перехватывать новые окна:ТЫЦ
     
  7. eregis

    eregis Member

    Joined:
    15 Jul 2010
    Messages:
    104
    Likes Received:
    5
    Reputations:
    -5
    спасибо за ссылку.. Надо мне учится составлять запросы гуглу)
     
  8. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Я прошу прощения, всё же я не правильно прочёл, при чём два раза.
    Для того, что бы открывать ссылки в новом окне - нужно проверять их, например опять же перехватываешь евент browser.Navigating, то есть евент вызывается непосредственно перед переходом к документу, и здесь можно проверить формат ссылки(у меня в коде выше есть) - если она подходит под критерии http:// - то добавляем новый таб и прикручиваем сцыль к нему.

    P.S. Или я всё таки правильно прочёл?))Что то я уже запутался :D Вообщем если это не то, что нужно то пиши, попробуем докопаться до истины :)
     
  9. eregis

    eregis Member

    Joined:
    15 Jul 2010
    Messages:
    104
    Likes Received:
    5
    Reputations:
    -5
    вот она истина)