2015-06-29 1 views
0

У меня есть приложение в Visual Studio с использованием WinForms и C#.Проверьте, не влияет ли управление веб-браузером на другую форму

Приложение имеет две формы, в которых одна из них видна при запуске. При запуске другая (скрытая) форма начинает навигацию по компоненту WebBrowser, и когда она загружается, она должна скрывать первую форму и показывать ее в браузере.

Я не уверен, как проверить, выполнена ли форма или нет. Однако я обнаружил, что можно использовать:

if (browser.ReadyState == WebBrowserReadyState.Complete) 

Но я не знаю, как сделать связи форм.

+0

С чем вы столкнулись? – leppie

+0

Я хочу проверить форму 2, если веб-браузер, который там в форме 1 загружен, закрыть форму 2 и показать форму 1 и веб-браузер – developerweb

+0

@developerweb я переписал вопрос (некоторое время назад), он что-то потерял? – ZombieSpy

ответ

1

На форме с вашего веб-браузера сделать открытый метод:

public bool IsWebBrowserReady 
    { 
     get { return browser.ReadyState == WebBrowserReadyState.Complete; }  
    } 

Тогда что-то вроде этого в главном:

private static void Main(string[] args) 
{ 
    //Initialize forms 
    var browserForm = new Form1(); 
    var startForm = new StartForm(); 

    //Show first form 
    startForm.Show(); 

    //Make sure second form is not visible 
    browserForm.WindowState=FormWindowState.Minimized; 
    browserForm.ShowInTaskbar = false; 

    //"Show" second form 
    browserForm.Show(); 

    //Wait for it to be ready 
    while (!browserForm.IsWebBrowserReady) Application.DoEvents(); 

    //Hide first form 
    startForm.Hide(); 

    //Show second form 
    browserForm.ShowInTaskbar = true; 
    browserForm.WindowState = FormWindowState.Normal; 

    Application.Run(); 
} 

Или вы можете переместить некоторые из этой логики в StartForm, передавая в нее ссылку второй формы. Затем вы можете получить доступ к IsWebBrowserReady из первой формы. Но если это просто решение для брызговиков, которое вы делаете, я бы сказал, что это будет излишним.

В качестве альтернативы опросу статуса веб-браузера можно также реагировать на веб-браузеры OnDocumentCompleted. Это будет другая картина, но посмотрите на ответ Зомби, чтобы получить представление.

+0

Как вы думаете, цикл 'Application.DoEvents()' лучше, чем событие OnDocumentCompleted? – ZombieSpy

+0

Не совсем, это просто еще один способ сделать это. DoEvents в основном недовольны :), но использование этого Main() довольно хорошо в моих глазах. – Wolf5

+0

Как вы думаете, вы можете добавить 'OnDocumentCompleted' (либо заменить свое приложение.DoEvents(), или упомянуть об этом как альтернативе)? Ваш ответ лучше, чем мой, поэтому, если вы упомянете «OnDocumentCompleted», я могу удалить свой ответ. – ZombieSpy

0

Я бы сказал, попробуйте это. Это не лучшее решение, но оно выполняет эту работу.

  • Убедитесь, что для элемента WebBrowserControl установлено значение «public», таким образом вы сможете получить доступ к элементам управления из другой формы. (Другими словами, элемент управления будет иметь модификатор доступа, который будет иметь значение «public»: читайте больше на https://msdn.microsoft.com/nl-be/library/wxh6fsc7.aspx)
  • Затем введите новую форму form1 из формы2 (или убедитесь, что в form2 есть переменная, содержащая ссылку на форму1). Таким образом, вы сможете манипулировать или запрашивать форму1 из формы2.

Как я уже сказал, не самое изящное решение, но это самый быстрый способ сделать это на данный момент.

1

У WebBrowser есть приятное небольшое событие под названием OnDocumentCompleted, которое вы можете прослушать. Он запускается при загрузке страницы.

Form form2 = new Form2(); 
form2.webBrowser1.OnDocumentCompleted += (e, sender) => 
{ 
    if (form2.webBrowser1.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete) // each frame trigger the event (?), make sure all is done 
    { 
    form2.show(); 
    hide(); 
    } 
}; 
form2.webBrowser.Navigate("{url}"); 

(код не проверяется, и не может быть правильным, но это должно дать вам и идея о том, что вы можете проверить)

Может нужно быть открытым, как это было предложено here.