首页 > 解决方案 > 将进度条值与 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;
         }
      }
   }

在执行任务期间更新进度条值的最佳方法是什么?谢谢!

标签: c#wpfxamlprogress-bar

解决方案


所以你看到的是对变量类型的疏忽。假设你总共有 10 个任务。当完成的任务低于 10 时,你总是得到零(0),为什么?因为你将两个整数相除。当它达到 10 时,你得到 100%。您只需要将一个整数转换为浮点数,然后再转换回整数,这也是var用于变量定义的好习惯:

    var percentage_completed = 100 * (int)((float )externalAPI.NumberOfTasksCompleted / externalAPI.TotalNumberOfTasks);

推荐阅读