使用WPF和MVVM模式实现进度条(使用BackgroundWorker) 注意:这段代码现在可以工作了。我已经修正了一些愚蠢的错误,并且正如SteveGreatrex指出的那样,我也修改了代码。
原始发布链接 ProgressbarSampleView.xaml使用WPF和MVVM模式实现进度条(使用BackgroundWorker) 注意:这段代码现在可以工作了。我已经修正了一些愚蠢的错误,并且正如SteveGreatrex指出的那样,我也修改了代码。,wpf,mvvm,progress-bar,backgroundworker,Wpf,Mvvm,Progress Bar,Backgroundworker,原始发布链接 ProgressbarSampleView.xaml ProggressbarSampleViewModel.cs 名称空间MyProject { 公共类ProggersBarSampleViewModel:ViewModelBase { 私人只读后台工作人员; 专用只读ICommand和煽动工作命令; 公共程序BarSampleViewModel() { this.designeWorkCommand=新建 RelayCommand(o=>this.worker.RunWor
ProggressbarSampleViewModel.cs
名称空间MyProject
{
公共类ProggersBarSampleViewModel:ViewModelBase
{
私人只读后台工作人员;
专用只读ICommand和煽动工作命令;
公共程序BarSampleViewModel()
{
this.designeWorkCommand=新建
RelayCommand(o=>this.worker.RunWorkerAsync(),o=>!this.worker.IsBusy);
this.worker=新的BackgroundWorker();
this.worker.DoWork+=this.DoWork;
this.worker.ProgressChanged+=this.ProgressChanged;
}
公共ICommand煽动工作命令
{
获取{返回this.indicateWorkCommand;}
}
私人互联网的最新进展;
公共卫生进展
{
获取{返回此。\u currentProgress;}
专用设备
{
如果(此._currentProgress!=值)
{
这是。_currentProgress=值;
OnPropertyChanged(“当前进度”);
}
}
}
私有void ProgressChanged(对象发送方,progresschangedventargs e)
{
this.CurrentProgress=e.ProgressPercentage;
}
私有无效DoWork(对象发送方,DoWorkEventArgs e)
{
//在此处执行耗时的工作,尽可能调用ReportProgress
对于(int i=0;i<100;i++)
{
睡眠(1000);
_当前进度=i;
OnPropertyChanged(“当前进度”);
}
}
}
StartNow命令
从不调用BackgroundWorker
-它只是在UI线程上同步执行DoStartNow
方法。基于此,我猜当你点击链接到StartNow
命令的按钮时,你会看到你的UI冻结了
您应该将按钮绑定到实际异步运行的BackgroundWorker
命令
在这个实现中,我认为您根本不需要StartNowCommand
。我也看不到视图模型中任何地方的DoWork
事件处理程序,因此我假设它在编写这样的字符串之后只调用DoStartNow
:“this.indicateWorkCommand=newrelayCommand”(o=>this.worker.RunWorkerAsync,o=>!this.worker.IsBusy);“.VS2010抛出一个错误:“委托”system.action“不接受1个参数”。您能告诉我如何克服它吗?您使用的是什么版本的.Net Framework
<UserControl x:Class="MyProject.ProgressbarSampleView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="718" Width="1024">
<ProgressBar Grid.Row="1"
Value="{Binding CurrentProgress, Mode=OneWay}"
Visibility="{Binding ProgressVisibility}"
Margin="22,0,25,0" />
<Button Grid.Row="2"
Content="Start Now"
Height="30"
Width="80"
HorizontalAlignment="Left"
Margin="22,4,0,0"
Name="btnStartNow"
VerticalAlignment="Top"
Command="{Binding Path=InstigateWorkCommand}"
/>
</UserControl>