<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的转换器。
基本上,在Value更改之前,ProgressBar不会重绘。因此,如果我有2个管并且1个失败,即使我再添加20个管,该栏仍然是半填充,直到NumFailed更改,然后比例更新。我已经尝试添加NumFailed属性的虚假通知,但由于值没有改变,显然不起作用。
想法?
答案 0 :(得分:4)
看起来条形图大小是在私有方法ProgressBar.SetProgressBarIndicatorLength
中计算的。它仅从OnValueChanged
,OnTrackSizeChanged
和OnIsIndeterminateChanged
调用。
您可以通过反射调用SetProgressBarIndicatorLength
,或者循环其中一个导致它被调用的属性。这是蹩脚的,但看起来ProgressBar
的设计看起来不像Maximum
和Minimum
会在中间进行更改。
无论您选择哪种方法,都可以使用DependencyPropertyDescriptor.AddValueChanged
找出Maximum
属性发生变化的时间:
DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(ProgressBar.MaximumProperty, typeof(ProgressBar)));
if (dpd != null)
{
dpd.AddValueChanged(myProgressBar, delegate
{
// handle Maximum changes here
});
}
答案 1 :(得分: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}}" />