C# 在WPF中使用ProgressBar,简单的应用程序

C# 在WPF中使用ProgressBar,简单的应用程序,c#,wpf,progress-bar,C#,Wpf,Progress Bar,我一直在努力理解这篇文章 我的按钮上有以下代码\u单击事件: FileInfo existingFile = new FileInfo("C:\\Users\\cle1394\\Desktop\\Apple Foreign Tax Payment Sample Layout Proposed - Sample Data.xlsx"); ConsoleApplication2.Program.ExcelData data = ConsoleApplication2.Program.GetExce

我一直在努力理解这篇文章

我的
按钮上有以下代码\u单击
事件:

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()

publicstaticexceldatagetexceldata(FileInfo文件)
{
ExcelData数据=新的ExcelData();
data.Countries=新列表();
使用(ExcelPackage xlPackage=新的ExcelPackage(文件))
{
//获取工作簿中的第一个工作表
Excel工作表工作表=xlPackage.Workbook.Worksheets[1];
List countryNames=新列表
{ 
“澳大利亚”/*,
“中国-北京”,
“中国-上海”,
“香港”,
“匈牙利”,
“爱尔兰”,
“西班牙”,
“联合王国”*/
};
列表月份名称=新列表
{
“一月”,
“二月”,
“三月”,
“四月”,
“五月”,
“六月”,
“七月”,
“八月”,
“9月”,
“十月”,
“11月”,
“12月”
};
foreach(国家名称中的字符串名称)
{
国家=新国家();
Console.WriteLine(名称);
country.Name=名称;
country.Months=新列表();
foreach(字符串_名称,以月为单位)
{
country.Months.Add(GetMonthDataRows(_名称,GetMonth(_名称,GetCountry(名称,工作表),工作表));
}
country.Totals=GetTotals(国家);
数据。国家。添加(国家);
//这是我想更新progressbar的地方
}
}//using语句调用Dispose()关闭包。
返回数据;
}

我想更新上面foreach循环中的progressbar。有人能给我举个例子吗?

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

我在WPF中也做了类似的事情,但我想在列表中显示更新消息,而不阻塞UI线程。您可以用消息替换本例中的列表。抱歉,现在没有时间编写它的简化版本。

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

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

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

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

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


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

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

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

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

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

作为进度值传递的值由您决定,但必须介于
ProgressBar
控件中设置的最小值和最大值之间。这个
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;
}
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);