c# - 将进度条值与 API 给出的属性值绑定
问题描述
我想更新 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 类可能如下所示:
外部API.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;
}
}
}
在执行任务期间更新进度条值的最佳方法是什么?谢谢!
解决方案
所以你看到的是对变量类型的疏忽。假设你总共有 10 个任务。当完成的任务低于 10 时,你总是得到零(0),为什么?因为你将两个整数相除。当它达到 10 时,你得到 100%。您只需要将一个整数转换为浮点数,然后再转换回整数,这也是var
用于变量定义的好习惯:
var percentage_completed = 100 * (int)((float )externalAPI.NumberOfTasksCompleted / externalAPI.TotalNumberOfTasks);
推荐阅读
- c++ - 类 C++ 的 shared_ptr 向量
- javascript - 来自 react-native 和 react-native-gesture-handler 的 Touchable 之间的区别
- laravel - 太多的作曲家包会减慢 laravel 应用程序吗?
- python - 如何使用查询集从博客(使用 django 构建)获取过去一小时发布的所有帖子?
- python - 如果文件太大,UTF8 转换需要很长时间并且会崩溃
- python - 在数组中的值之间插入不同数量的点
- reactjs - React + TailwindCSS 不显示背景图片
- scala - 使用 Akka Stream,如何动态复制流?
- javascript - 如何通过 Jest 测试测试从 JS 返回的 HTML span 元素?
- c++ - 在处理加载程序线程和大量数据时扩展关键部分的放置位置