我有一个.cab
提取工具。在我的主窗口中,我想显示正在提取的.cab
的名称,正在提取的文件以及提取的百分比。
我已经为每个字段编写了属性,即file name
,percentage
等,这些属于ViewModel
。
一切正常,但没有反映在UI上
MainVindowViewModel
:
public string FileExtract
{
get
{
return _fileExtract;
}
set
{
_fileExtract = value;
NotifyPropertyChanged("FileExtract");
}
}
public int Percent
{
get
{
return _percent;
}
set
{
_percent = value;
NotifyPropertyChanged("Percent");
}
}
提取方法
private void ExtractCab(string outputDirectory)
{
m_CabinetFile.FileExtractBefore += new EventHandler(CabinetFile_FileExtractBefore);
m_CabinetFile.FileExtractComplete += new EventHandler(CabinetFile_FileExtractComplete);
}
分别在提取文件之前和之后触发两个事件触发器。
通过以下方法,我可以获得驾驶室被解压缩时所需的所有信息,但不会反映在UI上
private void CabinetFile_FileExtractBefore(object sender, System.EventArgs e)
{
TFile file = (TFile)sender;
FileExtract = file.FullName;
}
private void CabinetFile_FileExtractComplete(object sender, System.EventArgs e)
{
Count++;
Percent = Convert.ToInt32(((decimal)Count / (decimal)m_CabinetFile.FileCount) * 100);
}
FileExtract
和Percent
属性绑定到XAML UI,后者在代码中更新,但不在UI中更新。 UI被卡住,直到完整的cab被提取出来。
答案 0 :(得分:1)
始终使用BackgroundWorker
在WPF中进行密集计算。主线程负责UI呈现,如果忙于解压缩,则无法响应其他请求。
BackgroudWorker类还提供回调以报告当前进度,您可以使用它来通知UI中的用户。