【问题标题】:WPF progress bar is at 100 % after startup启动后 WPF 进度条处于 100%
【发布时间】:2013-02-21 12:52:35
【问题描述】:

在 WPF 应用程序中,我定义了一个进度条。

<ProgressBar Minimum="0" Maximum="{Binding TotalItemCount}" Value="{Binding CurrentItemCount, UpdateSourceTrigger=PropertyChanged}" />

但是我的问题是进度条已完全填充,即在启动应用程序后直接填充 100%,尽管我最初将属性设置为以下值:

TotalItemCount = 0;
CurrentItemCount = 0;

只要我将TotalItemCount 更改为1,进度条就会正确设置为 0 %。在我看来,控件将 0 从 0 解释为 100 % 。

如何将进度条初始化为 0 %?

【问题讨论】:

  • 显然 0 of 0 是 100%。为什么不设置TotalItemCount = 1 作为初始值?
  • 我认为进度条此时不需要可见,为什么不隐藏它直到你真正加载项目?
  • TotalItemCount 属性绑定到另一个显示数字的标签控件。如果我将其初始化为 1,则用户认为已经有一项,因此他没有加载任何数据。
  • 您的最大值为 0,值为 0,因此达到最大值。数学在那里并没有真正发挥作用,虽然我不知道内部原理。
  • @Robert 当你说 0/0 没有定义时,你就明白了。只要最小值和最大值相等,就无法计算出有效的百分比。换句话说,任何值(无论是 0% 还是 100%)都同样无效。因此,您不能说“正确初始化为 0%”。唯一的解决办法是根本不显示进度条。

标签: c# wpf data-binding progress-bar


【解决方案1】:
public int MaxCountForProgress 
{
  get
  {
    if (TotalItemCount == 0)
      return int.MaxValue;
    return TotalItemCount;
  }
}

...

ProgressBar Minimum="0" Maximum="{Binding MaxCountForProgress}" Value="{Binding CurrentItemCount, UpdateSourceTrigger=PropertyChanged}"

【讨论】:

  • 如果用户想在进度条中显示当前值和最大值,这将失败。
  • 我赞成这个答案,因为这对我来说似乎是合理的 ;-) 但是我会隐藏进度条,直到真正需要它为止。
【解决方案2】:

您可以像这样为 ProgressBar 最大值编写一个转换器:

[ValueConversion(typeof(double), typeof(double))]
public class ProgressBarMaximumConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if ((double)value == 0)
        {
            return 1;
        }

        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null; 
    }
}

【讨论】:

    【解决方案3】:

    我做了一些小伙伴的建议:只要计数器为0,进度条就会隐藏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多