【发布时间】:2017-06-24 05:28:59
【问题描述】:
我有一个正在启动的加载页面(通常我的主页在启动时加载它,但我最近更换了它)。我有一个包含大量数据的 excel 文件。我有一个转储数据的类。我还为要创建的每个列表设置了一个类。加载页面应该随时更新它的百分比。
我能够让它在下面的示例中工作。
public partial class Window1 : Window
{
public MainController main = new MainController();
public ExcelImporter tempExcel = new ExcelImporter();
List<Character.MainRace> listRaces = new List<Character.MainRace>();
List<string> tempString = new List<string>();
public Window1()
{
InitializeComponent();
BackgroundWorker worker = new BackgroundWorker();
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.WorkerReportsProgress = true;
worker.DoWork += worker_DoWork;
worker.ProgressChanged += worker_ProgressChanged;
worker.RunWorkerAsync();
}
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBarTest.Value = e.ProgressPercentage;
textBlockPercent.Text = e.ProgressPercentage.ToString() + "%";
textBlockTest.Text = (string)e.UserState;
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
tempExcel.Create();
tempExcel.SetSheet("Races");
var worker = sender as BackgroundWorker;
worker.ReportProgress(0, String.Format("Process Iteration 1."));
List<string> myRaceName = tempExcel.GetRangeValue("A2", "A46");
List<string> myRaceShortDescription = tempExcel.GetRangeValue("N2", "N46");
for (int raceSelection = 0; raceSelection < myRaceName.Count - 1; raceSelection++)
{
Character.MainRace tempRace = new Character.MainRace();
tempRace.Race = myRaceName[raceSelection];
double percentage = ((double)raceSelection / (double)myRaceName.Count) * 100.0;
Thread.Sleep(10);
worker.ReportProgress((int)percentage, String.Format("Processing " + myRaceName[raceSelection]));
tempRace.ShortDescription = myRaceShortDescription[raceSelection];
listRaces.Add(tempRace);
}
worker.ReportProgress(100, "Done Processing");
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("All Done!");
progressBarTest.Value = 0;
textBlockTest.Text = "";
}
}
确实有两个地方需要更新 UI。每次我为每个加载器加载一组新数据时,比如人类、精灵等用于种族和战士,圣骑士、小偷等用于类。以及当我转到下一组数据时,例如 Classes Race、Feats 等(尽管为了缩短一点,我只显示了 1 个种族。
我对编码很陌生,尤其是 wpf。我一直在阅读一些教程。我尝试过使用 INotifyproperty、后台工作人员、调度程序、绑定而不是绑定内容。我只是不明白。一切都单独工作,但不能一起工作。据我了解,这是因为作为主线程的 UI 线程由于我的漫长过程而被阻塞。
【问题讨论】:
-
提供一个最小的可重现示例。
-
我消除了很多复杂性,使其更简单。我有一个值和一个我想调整的边框。每当比赛编译器在其循环中遇到新比赛时,都应该进行调整。
标签: c# wpf excel multithreading user-interface