在WPF中使用ProgressBar,简单应用

本文关键字:简单 应用 ProgressBar WPF | 更新日期: 2023-09-27 18:27:34

我一直在努力理解这篇文章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中使用ProgressBar,简单应用

将以下代码复制到教程中的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方法中写下你当前正在做的事情。

我在WPF中也做过类似的事情,但我想在列表中显示更新消息,而不阻塞UI线程,请参阅此处。您可以将此示例中的列表替换为一条消息。抱歉,现在没有时间写它的简化版本。

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

这个对象提供了一种在单独的线程中执行长时间运行操作的简单方法。如果您不希望UI在执行操作时被锁定,那么在独立于UI线程的线程上执行长时间运行的操作是至关重要的。是否为此使用Console应用程序无关紧要。

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

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

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

因此,与上述示例的唯一连接是GetExcelData()方法,您可以将其放入DoWork方法中。