我喜欢使用绑定来控制进度条(以及尽可能多的其他内容),因为这样你就不需要担心调度到UI线程。
基本上,你需要创建一个实现INotifyPropertyChanged接口的类,其中包含一个进度属性,你可以将进度条绑定到该属性。例如:
public class Task : INotifyPropertyChanged
{
private int _progress = 0;
public int Progress
{
get { return _progress; }
private set
{
if (_progress != value)
{
_progress = value;
OnPropertyChanged("Progress");
}
}
}
public Task(ref ProgressChangedEventHandler progressChangedEvent)
{
progressChangedEvent += (s, e) => Progress = e.ProgressPercentage;
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
这个类在构造函数中使用一个事件,如果触发,将更新任务的进度。但是您可以以任何您喜欢的方式处理进度更改,例如通过方法或使Progress属性 public
,以便随意更改它。
使用示例:
<ProgressBar Minimum="0" Maximum="100" Height="20"
Value="{Binding UpdateTask.Progress, Mode=OneWay}"/>
private event ProgressChangedEventHandler UpdateProgressChanged;
private readonly Task _updateTask;
public Task UpdateTask
{
get { return _updateTask; }
}
public MainWindow()
{
_updateTask = new Task(ref UpdateProgressChanged);
}
private void OnUpdateProgressChanged(int progressPercentage)
{
if (UpdateProgressChanged != null)
{
UpdateProgressChanged(this, new ProgressChangedEventArgs(progressPercentage, null));
}
}
private void Button1_Click(object sender, RoutedEventArgs e)
{
int progress = 0;
DispatcherTimer timer = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(0.5) };
timer.Tick += (sSub,eSub) =>
{
progress++;
OnUpdateProgressChanged(progress);
if (progress == 100)
{
timer.Stop();
}
};
timer.Start();
}
ref
关键字)获取事件。 - H.B.Task
类进行了更改,需要将事件通过引用传递? - H.B.