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