using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media.Imaging;
namespace IMDBWpf
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
///
public partial class MainWindow : Window
{
private List<Movie> movieList;
BackgroundWorker bgWorker;
private string searchText;
public MainWindow()
{
InitializeComponent();
bgWorker = new BackgroundWorker();
bgWorker.DoWork += bgWorker_doWork;
bgWorker.RunWorkerCompleted += bgWorker_Completed;
}
private void bgWorker_Completed(object sender, RunWorkerCompletedEventArgs e)
{
Dispatcher.Invoke(() =>
{
movieList = new Movies(searchText).movieList;
searchBar.ItemsSource = movieList;
});
}
private void bgWorker_doWork(object sender, DoWorkEventArgs e)
{
Dispatcher.Invoke(() =>
{
var loadingMovie = new Movie("src\\loader.gif", "Loading...");
movieList = new List<Movie>();
movieList.Add(loadingMovie);
searchBar.ItemsSource = movieList;
searchBar.IsDropDownOpen = true;
});
}
private void searchBar_DataContextChanged(object sender, RoutedEventArgs e)
{
searchText = searchBar.Text;
if(!bgWorker.IsBusy)
bgWorker.RunWorkerAsync();
}
}
}
我有一个组合框。组合框中的每个元素都有一个标签和一个图像。当BackgroundWorker工作时UserInterface冻结
组合框中充满了来自网页的元素,这个过程需要一段时间才能完成。
主要问题是,当我在comboBox中写入某些内容(是的,它是可编辑的)时,我的应用程序冻结,直到带有元素的列表被创建。为了摆脱这个冻结,我试图使用BackgroundWorker,但它不工作......任何想法为什么? 我试图在生成列表的类上使用线程,但没有任何反应。
using HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace IMDBWpf
{
struct Movie
{
public Movie(string movieImg, string movieT)
{
movieTitle = movieT;
movieImage = movieImg;
}
public string movieTitle { get; set; }
public string movieImage { get; set; }
}
class Movies
{
public List<Movie> movieList { get; set; }
public Movies(string movieName)
{
if (movieName.Length > 0)
{
populateList(movieName);
}
}
private void populateList(string movieName)
{
var webSite = new HtmlAgilityPack.HtmlWeb();
var siteAddress = "http://www.imdb.com/find?ref_=nv_sr_fn&q=" + movieName + "&s=tt";
HtmlDocument htmlPage = webSite.Load(siteAddress);
movieList = new List<Movie>();
int index = 0;
while (htmlPage.DocumentNode.Descendants("td").ElementAt(index).Descendants("a").Any())
{
var movie = new Movie();
movie.movieImage = htmlPage.DocumentNode.Descendants("td").ElementAt(index++).Descendants("a").ElementAt(0).Descendants("img").ElementAt(0).GetAttributeValue("src", "");
movie.movieTitle = htmlPage.DocumentNode.Descendants("td").ElementAt(index++).InnerText;
movieList.Add(movie);
}
}
}
}
我假设'searchbar'是'ComboBox'。 – xoxox
“bgWorker_Completed”中'movieList'的计数是多少? – xoxox
@xoxox是的,这是组合框 我使用类Movies来创建电影列表。该课是冻结的原因,我需要一个不同的线程。 – Marius