簡體   English   中英

來自 Excel 的 WPF UI 更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM