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がフリーズする
コンボボックスは、完了するまでに時間がかかるウェブページの要素で満たされています。
主な問題は、コンボボックスに何かを書き込むと(はい、編集可能です)、要素を含むリストが作成されるまでアプリがフリーズすることです。このフリーズを取り除くために、私は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はい、それはコンボボックスです ムービーのリストを作成するにはムービークラスを使用します。そのクラスはフリーズの理由であり、私はそれのために別のスレッドが必要です。 – Marius