WPF webBrowser: как отобразить изображение после завершения рендеринга - PullRequest
3 голосов
/ 26 сентября 2011

В моем пользовательском интерфейсе есть веб-браузер. Я спрашиваю, возможно ли, чтобы оно отображалось не напрямую, а через изображение, и я хочу, чтобы изображение обновлялось только при получении события LoadCompleted. Как это сделать?

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

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

Если это так, этот код должен помочь (я предполагаю, что вы подключили событие «LoadCompleted» к методу «webBrowser1_LoadCompleted»). Этот код использует кнопку («button1») для запуска навигации, но вы можете использовать ее в любом другом месте.

//here is the code that triggers the navigation: when the button is clicked, I hide the
//webBrowser and then navigate to the page (here I used Google as an example)
    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
        webBrowser1.Visibility = Visibility.Hidden;
        webBrowser1.Navigate(new Uri("http://www.google.it")); 
    } 

    private void webBrowser1_LoadCompleted(object sender, NavigationEventArgs e) 
    { 
        webBrowser1.Visibility = Visibility.Visible; 
    } 

Имейте в виду, однако, что не показывать пользователю что-либо в течение длительного периода времени (как с тяжелой страницей) не всегда хорошая идея, в зависимости от типа приложения, которое вы пишете. Это зависит только от вас.

0 голосов
/ 27 сентября 2011

(я решил оставить предыдущий ответ, если кому-то это нужно)

Если вы хотите оставить предыдущую страницу видимой, пока не появится новая, тогда, я думаю, вам нужна Windows DLL. Вот как бы я это сделал.

В верхней части файла кода вставьте эти два оператора импорта:

using System.Runtime.InteropServices;
using System.Windows.Interop;

Затем вам нужно объявить свою функцию DLL следующим образом (в классе Window):

 [DllImport("user32")]
 private static extern int LockWindowUpdate (IntPtr hWnd);

Тогда давайте немного изменим код в предыдущем ответе:

 private void button1_Click(object sender, RoutedEventArgs e) 
 {
     IntPtr handle = new WindowInteropHelper(Application.Current.MainWindow).Handle;
     LockWindowUpdate(handle);
     webBrowser1.Navigate(new Uri("http://www.google.it")); 
 } 

 private void webBrowser1_DocumentCompleted(object sender, NavigationEventArgs e) 
 {
     LockWindowUpdate(new IntPtr(0));
 }

Это должно держать последнюю загруженную страницу на экране до тех пор, пока новая страница не закончит рендеринг; как вы можете себе представить, функция DLL просто блокирует обновление окна, передавая его дескриптор. Ручка 0 открывает его.

...