3
<ProgressBar Foreground="Red"
             Background="Transparent"
             Value="{Binding NumFailed, Mode=OneWay}"
             Minimum="0"
             Maximum="{Binding NumTubes, Mode=OneWay, Converter={x:Static wpftools:DebuggingConverter.Instance}, ConverterParameter=Failedprogressbar}"
             FlowDirection="RightToLeft"
             Style="{DynamicResource {x:Static wpftools:CustomResources.StyleProgressBarVistaKey}}" />

这就是我的进度条目前的样子。样式来自http://mattserbinski.com/blog/look-and-feel-progressbar,DebuggingConverter是一个无操作转换器,可将值、类型和参数打印到控制台。我已经验证,当我的 NumTubes 属性发生变化时,Maximum 的转换器被调用了。

基本上,ProgressBar 在值更改之前不会重绘。所以,如果我有 2 个管子并且 1 个失败了,即使我再添加 20 个管子,该条仍然是一半填充,直到 NumFailed 更改,然后更新比例。我尝试添加 NumFailed 属性的虚假通知,但这显然不起作用,因为值没有改变。

想法?

4

2 回答 2

4

看起来酒吧大小是在私有方法中计算的ProgressBar.SetProgressBarIndicatorLengthOnValueChanged它只能从、OnTrackSizeChanged和调用OnIsIndeterminateChanged

您可以SetProgressBarIndicatorLength通过反射调用,或循环调用它的属性之一。这是蹩脚的,但它看起来不像ProgressBar是设计的,Maximum并且Minimum会在中期进行更改。

无论您选择哪种方法,您都可以Maximum使用以下方法确定属性何时更改DependencyPropertyDescriptor.AddValueChanged

DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(ProgressBar.MaximumProperty, typeof(ProgressBar)));
if (dpd != null)
{
   dpd.AddValueChanged(myProgressBar, delegate
   {
      // handle Maximum changes here
   });
}
于 2009-03-17T21:53:31.493 回答
2

我无法让解决方案在这里工作,但我找到了另一种解决方法。当我更改对象的数据源时,我的进度条不会更新(11 个中的 11 个将更改为 10 个中的 10 个并冻结进度条),并意识到我根本不需要更新最大值。

相反,我在值上使用转换器将其转换为百分比,并将最大值设置为 100。结果显示相同,但​​没有更改最大值的错误。

public class CreatureStaminaConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var creature = (CreatureBase.CreatureEntityData) value;
        double max = creature.entityData.MaxStat;
        return creature.CurrentStamina/max*100;
    }

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

 <ProgressBar Name="rpbStamina" Minimum="0" Maximum="100" Value="{Binding entityData, Converter={StaticResource CreatureStaminaConverter}}" />
于 2011-08-19T18:37:49.423 回答