0

我一直在尝试理解这篇文章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 循环中的进度条。有人可以告诉我一个如何做到这一点的例子吗?

4

3 回答 3

1

我在 WPF 中做了类似的事情,但我想在列表中显示更新消息而不阻塞 UI 线程,请参见此处。您可以用消息替换此示例中的列表。不好意思,刚才没时间写个简化版。

于 2013-08-13T13:27:46.960 回答
1

在文章中,您将看到一个BackgroundWorker对象。首先,阅读 MSDN 上的BackgroundWorker 类

该对象提供了一种在单独的线程中执行长时间运行的操作的简单方法。如果您不希望 UI 在执行操作时锁定,则必须在与 UI 线程分开的线程上执行长时间运行的操作。是否为此使用控制台应用程序无关紧要。

在本文中,您还将看到一个ProgressChangedEventHandler设置为bw_ProgressChanged在构造函数中调用的方法。此bw_ProgressChanged方法将在 UI 线程上调用,因此您可以在此处访问您的 UI 元素,即您的ProgressBar对象。

现在看一下bw_DoWork方法...这是您...在另一个线程(由创建的)上执行工作(长时间运行的操作)的地方BackgroundWorker。现在,请注意BackgroundWorkwer从参数创建的行sender...这是必不可少的,因为您需要使用该对象bw_ProgressChanged从另一个线程调用该方法。这是使用类的ReportProgress方法完成的BackgroundWorkwer

作为进度值传递的值取决于您,但必须介于您在ProgressBar控件中设置的最小值和最大值之间。这个想法是你定期传递一个值,每次你做一些工作时都会增加一个值,并以你设置的值结束ProgressBar.Maximum

因此,与上述示例的唯一联系是GetExcelData()您将在方法中放入的DoWork方法。

于 2013-08-13T13:29:24.350 回答
1

将以下代码复制到教程中的 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 方法中编写当前正在执行的操作的地方。

于 2013-08-13T13:41:38.020 回答