WPF UI Update from excel



我有一个正在启动的加载页面(通常我在启动时让主页加载它,但我最近交换了它)。我有一个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。每次我为每个加载器加载一组新的数据,比如种族的人类、精灵等,职业的战士、圣骑士、小偷等。以及当我转到下一组数据时,如职业、种族、特征等(尽管为了缩短时间,我只显示了1个种族。

一般来说,我对编码还很陌生,尤其是wpf。我一直在复习一些教程。我尝试过使用INotifyproperty、后台工作者、调度器、绑定和不绑定内容。我只是不明白。一切都是分开工作的,但不是一起工作的。据我所知,这是因为作为主线程的UI线程由于我的长进程而被阻塞。

正如Jeroen所提到的,我们需要一个例子。您正试图根据[creng]硬编码Excel区域的内容更新WPF UI。我猜工作簿导入部分可以工作,但UI冻结了?还是不更新?

首先,尝试使用DataGrid在UI上显示数据。将其ItemsSource绑定到一个类的List(或ObservableCollection),该类可以很好地保存所有相关数据。DataGrid应该执行其余操作,因为默认情况下AutoGenerateColumns为true。

然后,为了获得进一步的帮助,你必须尝试一些事情,并提供一个可重复的失败例子。展示BackgroundWorker的实现将提供一些关于保持主UI线程的线索。

最新更新