簡體   English   中英

在WPF中使用ProgressBar,簡單應用

[英]Using ProgressBar in WPF, Simple Application

我一直在努力使這篇文章有意義http://bensprogrammingwork.blogspot.com/2012/01/progressbar-in-wpf.html

我的Button_Click事件具有以下代碼:

FileInfo existingFile = new FileInfo("C:\\Users\\cle1394\\Desktop\\Apple Foreign Tax Payment Sample Layout Proposed - Sample Data.xlsx");

ConsoleApplication2.Program.ExcelData data = ConsoleApplication2.Program.GetExcelData(existingFile);

GetExcelData()方法需要幾分鍾才能完成,因此我想顯示一個進度條以指示完成之前的估計時間。

但是,我不知道如何將上面教程中的方法應用於下面的GetExcelData()代碼:

public static ExcelData GetExcelData(FileInfo file)
{
    ExcelData data = new ExcelData();
    data.Countries = new List<Country>();

    using (ExcelPackage xlPackage = new ExcelPackage(file))
    {
        // get the first worksheet in the workbook
        ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets[1];

        List<string> countryNames = new List<string> 
        { 
            "Australia"/*,
            "China - Beijing",
            "China - Shanghai",
            "Hong Kong",
            "Hungary",
            "Ireland",
            "Spain",
            "United Kingdom"*/
        };

        List<string> monthNames = new List<string>
        {
            "January",
            "February",
            "March",
            "April",
            "May",
            "June",
            "July",
            "August",
            "September",
            "October",
            "November",
            "December"
        };

        foreach (string name in countryNames)
        {
            Country country = new Country();

            Console.WriteLine(name);

            country.Name = name;
            country.Months = new List<Month>();

            foreach (string _name in monthNames)
            {
                country.Months.Add(GetMonthDataRows(_name, GetMonth(_name, GetCountry(name, worksheet), worksheet), worksheet));
            }

            country.Totals = GetTotals(country);

            data.Countries.Add(country);

            // this is where I would like to update the progressbar

        }

    } // the using statement calls Dispose() which closes the package.

    return data;
}

我想在上面的foreach循環中更新進度條。 有人可以給我示范一個例子嗎?

我在WPF中做過類似的事情,但是我想在列表中顯示更新消息而不阻塞UI線程, 請參見此處 您可以在此示例中用消息替換列表。 抱歉,暫時沒有時間編寫簡化版本。

在本文中,您將看到BackgroundWorker對象。 首先,了解MSDN上的BackgroundWorker類

該對象提供了一種在單獨的線程中執行長時間運行的操作的簡便方法。 如果您不希望UI在執行操作時鎖定,則必須在與UI線程不同的線程上執行長時間運行的操作。 是否為此使用控制台應用程序都無關緊要。

在本文中,您還將看到一個ProgressChangedEventHandler ,它在構造函數中設置為名為bw_ProgressChanged的方法。 bw_ProgressChanged方法將在UI線程上調用,因此您可以在其中訪問UI元素(即ProgressBar對象)。

現在看一下bw_DoWork方法...在這里...在另一個線程(由BackgroundWorker創建)上執行工作(長時間運行的操作)。 現在,請注意從sender參數創建BackgroundWorkwer的行...這是必不可少的,因為您需要使用該對象從另一個線程調用bw_ProgressChanged方法。 這是使用BackgroundWorkwer類的ReportProgress方法完成的。

作為進度值傳遞的值取決於您,但是必須在您在ProgressBar控件中設置的最小值和最大值之間。 這個想法是,您定期傳遞一個值,該值在每次工作時都會增加,並以您將ProgressBar.Maximum設置為的值結束。

因此,與上面的示例的唯一連接是您將放入DoWork方法中的GetExcelData()方法。

將以下代碼復制到教程中的bw_dowork方法中,它應該可以工作。

FileInfo existingFile = new FileInfo("C:\\Users\\cle1394\\Desktop\\Apple Foreign Tax Payment     Sample Layout Proposed - Sample Data.xlsx");

ConsoleApplication2.Program.ExcelData data =  ConsoleApplication2.Program.GetExcelData(existingFile); 

因此,他們正在做的是onStart_click他們啟動了后台異步任務,這是您需要在onClick方法中編寫當前正在執行的操作的地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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