【发布时间】:2019-07-15 21:01:51
【问题描述】:
我想更新 WPF 表单中进度条的值,以指示一组任务的进度。
这些任务由 dll 中提供的 API 执行。 API 提供有关任务总数和已完成任务数的信息。
我已将进度条的值与我的主类中的一个属性绑定,但我无法显示任务执行过程中的进度,只能显示 0% 和 100% 的进度。
MyForm.xaml.cs
public partial class MyForm : Page, INotifyPropertyChanged
{
public int PercentageOfTasksCompleted
{
get
{
int percentage_completed = 100 * externalAPI.NumberOfTasksCompleted / externalAPI.TotalNumberOfTasks;
return percentage_completed;
}
set
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("PercentageOfTasksCompleted"));
}
}
}
private async void ButtonExecuteTasks_ClickAsync(object sender, RoutedEventArgs e)
{
await Task.Run(() =>
{
externalAPI.ExecuteTasks();
});
}
}
MyForm.xaml
<Grid HorizontalAlignment="Left" VerticalAlignment="Bottom" Height="20" Width="200">
<ProgressBar x:Name="myProgressBar" Value="{Binding PercentageOfTasksCompleted, Mode=OneWay}" Minimum="0" Maximum="100"/>
<TextBlock Text="{Binding ElementName=myProgressBar, Path=Value, StringFormat={}{0:0}%}" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
至于重现场景,我认为外部 API 类可能如下所示:
ExternalAPI.cs
public class ExternalAPI
{
public int TotalNumberOfTasks {get; private set;}
public int NumberOfTasksCompleted {get; private set;}
public void ExecuteTasks() {
for (int i=1; i<=TotalNumberOfTasks; i++)
{
Thread.Sleep(100);
NumberOfTasksCompleted = i;
}
}
}
在执行任务期间更新进度条值的最佳方法是什么?谢谢!
【问题讨论】:
-
这是 Xamarin 还是 WPF?您在问题中写了“Xamarin”,但标记为 WPF。你在哪里设置
PercentageOfTasksCompleted属性? Xamarin 是否要求您显式处理绑定属性的跨线程封送处理?其他基于 XAML 的 API 没有(WPF、UWP),但 Xamarin 可能有。目前,您的问题质量不足,无法提供良好的答案。请改进它,包括添加一个好的minimal reproducible example 以可靠地重现问题。 -
@PeterDuniho 这是 WPF 抱歉,我已经更正了文本。我不知道在哪里设置
PercentageOfTasksCompleted。我从 API 获得的唯一信息是TotalNumberOfTasks和NumberOfTasksCompleted。一旦我打电话给externalAPI.ExecuteTasks(),我知道进度的唯一方法就是检查externalAPI.NumberOfTasksCompleted。至于最小的工作示例,我认为可以是:public void ExecuteTasks() { for (int i=1; i<=TotalNumberOfTasks; i++) { Thread.Sleep(100); NumberOfTasksCompleted = i; } } -
“一旦我调用 externalAPI.ExecuteTasks() 是我知道它检查 externalAPI.NumberOfTasksCompleted 进度的唯一方法” - 那么你将不得不定期这样做在任务执行时。
标签: c# wpf xaml progress-bar