我喜歡使用ProgressBars的綁定(以及幾乎所有可能的地方),因爲這樣你不必擔心dispatching to the UI thread。
基本上你創建了一些實現INotifyPropertyChanged的類,並且你可以綁定你的ProgressBar進度屬性。例如
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}"/>
// The event that should be raised when a progress occurs.
private event ProgressChangedEventHandler UpdateProgressChanged;
// The task the ProgressBar binds to.
private readonly Task _updateTask;
public Task UpdateTask
{
get { return _updateTask; }
}
public MainWindow()
{
// Instatiate task, hooking it up to the update event.
_updateTask = new Task(ref UpdateProgressChanged);
}
private void OnUpdateProgressChanged(int progressPercentage)
{
if (UpdateProgressChanged != null)
{
UpdateProgressChanged(this, new ProgressChangedEventArgs(progressPercentage, null));
}
}
// Simple progress simulation
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++;
// Raise progress changed event which in turn will change
// the progress of the task which in turn will cause
// the binding to update which in turn causes the value
// of the ProgressBar to change.
OnUpdateProgressChanged(progress);
if (progress == 100)
{
timer.Stop();
}
};
timer.Start();
}
好的,如果我想要將進度條綁定到進度條上,我使用Progress屬性,對不對?你能舉一個將進度條綁定到這個屬性的例子嗎? – Miguel 2011-04-25 02:34:46
增加了一個示例,也修復了任務類中的錯誤,構造函數需要通過引用('ref'關鍵字)獲取事件。 – 2011-04-25 03:13:29
由於某種原因,ProgressBar不會更新其值... – Miguel 2011-04-25 07:40:04