【问题标题】:WPF UI Update from excel来自 Excel 的 WPF UI 更新
【发布时间】: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


【解决方案1】:

正如 Jeroen 所说,我们需要一个例子。您正在尝试根据 [cringe] 硬编码 Excel 范围的内容更新 WPF UI。我猜工作簿导入部分有效,但 UI 冻结?还是不更新?

首先,尝试使用DataGrid 在用户界面上显示您的数据。将其ItemsSource 绑定到一个类的List(或ObservableCollection),该类可以很好地保存所有相关数据。 DataGrid 应该完成其余的工作,因为 AutoGenerateColumns 默认为 true。

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

【讨论】:

  • 我以后会切换到数据库。现在我使用 excel 只是为了简化测试,因为我正在抓取数据并将其转储到 excel 中。
  • 没关系。但最初的问题是关于 WPF UI 更新DataGrid 提供了一种显示所有 Excel 数据的简单方法。如果没有任何关于您的 UI 正在做什么的明确示例,我们将无能为力。
  • "加载页面应该会更新它的百分比。"我希望我的自定义进度条 UI 在它通过每个文件移动时进行更新。以为我已经说清楚了。
  • > 显示你的BackgroundWorker 的实现将提供一些关于保持主 UI 线程的线索。它可能没有更新,因为您持有 UI 线程。我最近将我的项目从BackgroundWorker 升级到Task.Run。我也会在这里推荐它。
猜你喜欢
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
相关资源
最近更新 更多