Открытая ссылка на новой вкладке (Управление WebBrowser)

Как это:

lstItems.ToConcatenatedString(s => s, ", ")

, Если Вы хотите проигнорировать пустые строки как в Вашем примере:

lstItems
    .Where(s => s.Length > 0)
    .ToConcatenatedString(s => s, ", ")

самая популярная пользовательская агрегатная функция на моей панели инструментов. Я использую его каждый день:

public static class EnumerableExtensions
{

    /// <summary>
    /// Creates a string from the sequence by concatenating the result
    /// of the specified string selector function for each element.
    /// </summary>
    public static string ToConcatenatedString<T>(
        this IEnumerable<T> source,
        Func<T, string> stringSelector)
    {
        return EnumerableExtensions.ToConcatenatedString(source, stringSelector, String.Empty);
    }

    /// <summary>
    /// Creates a string from the sequence by concatenating the result
    /// of the specified string selector function for each element.
    /// </summary>
    /// <param name="separator">The string which separates each concatenated item.</param>
    public static string ToConcatenatedString<T>(
        this IEnumerable<T> source,
        Func<T, string> stringSelector,
        string separator)
    {
        var b = new StringBuilder();
        bool needsSeparator = false; // don't use for first item

        foreach (var item in source)
        {
            if (needsSeparator)
                b.Append(separator);

            b.Append(stringSelector(item));
            needsSeparator = true;
        }

        return b.ToString();
    }
}
12
задан abatishchev 4 March 2011 в 14:34
поделиться

4 ответа

На основании ваших комментариев я понимаю, что вы хотите перехватить действие «Открыть в новом окне» для элемента управления WebBrowser и вместо этого переопределить поведение по умолчанию, чтобы открыть его в новой вкладке внутри вашего приложения. .

Чтобы сделать это надежно, необходимо получить событие NewWindow2, которое предоставляет ppDisp (устанавливаемый указатель на элемент управления WebBrowser, который должен открывать новое окно). Все другие возможные решения (например, получение последней ссылки, выбранной пользователем перед событием OpenWindow) не оптимальны и в крайних случаях обречены на неудачу.

К счастью, есть (относительно) простой способ сделать это, при этом все еще используя элемент управления System.Windows.Forms.WebBrowser в качестве основы. Все, что вам нужно сделать, это расширить WebBrowser и перехватить событие NewWindow2, предоставив общий доступ к экземпляру ActiveX (для перехода в ppDisp на новых вкладках). Это уже делалось раньше, и у Маурисио Рохаса есть отличный пример с полным рабочим классом «ExtendedWebBrowser»:

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

Когда у вас есть класс ExtendedWebBrowser, все, что вам нужно сделать, это настроить обработчики для NewWindow2 и указать ppDisp на браузер в новой вкладке. Вот пример, который я собрал:

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

    }

(Предполагается, что TabControl с именем "Tabs" и начальная вкладка, содержащая дочерний элемент управления, закрепленный ExtendedWebBrowser с именем "InitialWebBrowser")

Не забудьте отменить регистрацию событий, когда вкладки закрыты!

26
ответ дан 2 December 2019 в 04:25
поделиться
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;
}
4
ответ дан 2 December 2019 в 04:25
поделиться

В элементе управления веб-браузера нет вкладок, поэтому вам нужно обрабатывать вкладки самостоятельно. Добавьте элемент управления вкладкой над элементом управления веб-браузера и создавайте новые элементы управления веб-браузера при открытии новых вкладок. Поймать и отменить, когда пользователь открывает новые окна и вместо этого открывает новые вкладки.

-2
ответ дан 2 December 2019 в 04:25
поделиться

Следующий код работает, просто следуйте первому ответу для создания класса ExtendedWebBrowser.

Я использую его, чтобы открыть новую вкладку, но он также работает, чтобы открыть новое окно, используя ваш браузер, а не IE.

Надеюсь, это поможет.

 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); 
        }
3
ответ дан 2 December 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: