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();
}
}
}
J'ai un comboBox. Chaque élément de combobox possède une étiquette et une image. La comboBox est remplie avec des éléments d'une page Web, processus qui prend un certain temps jusqu'à ce que ce soit fait.UserInterface se bloque lorsque BackgroundWorker fonctionne
Le problème principal est que lorsque j'écris quelque chose dans comboBox (oui, c'est modifiable), mon application se bloque jusqu'à ce que la liste avec les éléments soit créée. Pour se débarrasser de ce gel, j'ai essayé d'utiliser BackgroundWorker, mais ça ne fonctionne pas ... Des idées pourquoi? J'ai essayé d'utiliser le thread sur la classe qui génère la liste, mais rien ne se passe.
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);
}
}
}
}
Je suppose que 'searchbar' est le' ComboBox'. – xoxox
Quel est le nombre de 'movieList' dans' bgWorker_Completed'? – xoxox
@xoxox Oui, c'est la ComboBox J'utilise la classe Films pour créer la liste des films. Cette classe est la raison de geler et j'ai besoin d'un fil différent pour cela. – Marius