[英]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。 每次我为每个加载器加载一组新数据时,如人类、精灵等,用于种族和战士、圣骑士、小偷等。 以及当我继续处理下一组数据时,例如 Classes Race、Feats 等(虽然为了保持这个更短一些,我只包括仅显示 1 个种族。
我对一般编码很陌生,尤其是 wpf。 我一直在经历一些教程。 我试过使用 INotifyproperty、后台工作人员、调度员、绑定和不绑定内容。 我只是不明白。 一切都单独工作,但不能一起工作。 据我了解,这是因为作为主线程的 UI 线程由于我的漫长过程而被阻塞。
正如 Jeroen 提到的,我们需要一个例子。 您正在尝试根据 [ cringe ] 硬编码 Excel 范围的内容更新 WPF UI。 我猜工作簿导入部分有效,但用户界面冻结了? 还是不更新?
首先,尝试使用DataGrid
在 UI 上显示您的数据。 将其ItemsSource
绑定到一个类的List
(或ObservableCollection
),该类可以很好地保存所有相关数据。 DataGrid
应该完成剩下的工作,因为AutoGenerateColumns
默认为 true。
然后,为了获得进一步的帮助,您必须尝试一些东西并提供一个可重现的失败示例。 显示您的BackgroundWorker
的实现将提供一些关于保持主 UI 线程的线索。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.