У меня есть кнопка, которая перемещается по веб-странице. Я пытался установить навигацию в фоновой рабочей среде, но она не перемещается. Если я поместил его в событие нажатия кнопки, он отлично работает. Я поставил точку останова в bgw_DoWork, и он показывает, что он достигает точки создания нового объекта wb, однако он пропускает остальные инструкции в DoWork. Я хотел сделать это, чтобы отображать загрузочный образ, когда он пытается получить данные с веб-страницы. Объект webbrowser не является частью пользовательского интерфейса, так как пользователю не нужно видеть скребок. Он просто загружает информацию в объект, а затем отображает объект (за пределами BackgroundWorker).BackgroundWorker в WPF не работает
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows;
using System.Windows.Threading;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Reflection;
using System.ComponentModel;
using mshtml;
namespace WPF1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
WebBrowser wb;
private readonly BackgroundWorker bgw = new BackgroundWorker();
public int i = 0;
public MainWindow()
{
InitializeComponent();
bgw.DoWork += bgw_DoWork;
bgw.RunWorkerCompleted += bgw_RunWorkerCompleted;
}
private void GetSICData_Click(object sender, RoutedEventArgs e)
{
//mainTabControl.SelectedIndex = 1;
//wb.Navigated += wb_Navigated;
//wb.LoadCompleted += wb_LoadCompleted;
//wb.Navigate("http://www.google.com");
bgw.RunWorkerAsync();
}
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
wb = new WebBrowser();
wb.Navigated += wb_Navigated;
wb.LoadCompleted += wb_LoadCompleted;
wb.Navigate("http://www.google.com");
}
private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Background Complete");
}
void wb_LoadCompleted(object sender, NavigationEventArgs e)
{
HTMLDocument doc = (HTMLDocument)wb.Document;
doc.getElementById("ctl03_TextBox1").innerText = "2334882";
wb.LoadCompleted -= wb_LoadCompleted;
wb.LoadCompleted += wb_LoadCompleted_2;
doc.getElementById("ImageButton1").click();
}
void wb_LoadCompleted_2(object sender, NavigationEventArgs e)
{
MessageBox.Show("It Worked!");
}
void wb_Navigated(object sender, NavigationEventArgs e)
{
}
}
}
Вы не можете управлять элементами пользовательского интерфейса в фоновом потоке –
Есть ли способ создать объект webbrowser, который не является частью пользовательского интерфейса? – user3175176
@ user3175176 Возможно, вам не следует использовать WebBrowser, если вы не хотите отображать его как часть пользовательского интерфейса, вместо этого вы, вероятно, должны использовать другие классы, которые предназначены для загрузки содержимого веб-сайта без их отображения. – Servy