<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}}" />
This is what my progressbar looks like at the moment. The style came from http://mattserbinski.com/blog/look-and-feel-progressbar and the DebuggingConverter is a no-op converter that prints the value, type and parameter to the Console. I have verified that the converter for the Maximum is being called when my NumTubes property is changed.
Basically, the ProgressBar won't redraw until the Value changes. So, if I have 2 tubes and 1 is failed, even if I add 20 more tubes, the bar is still half filled until the NumFailed changes, then the proportion is updated. I've tried adding spurious notifications of the NumFailed property, but that apparently doesn't work since the value didn't change.
Ideas?
It looks like the bar size is calculated in the private method
ProgressBar.SetProgressBarIndicatorLength
. It's only called fromOnValueChanged
,OnTrackSizeChanged
, andOnIsIndeterminateChanged
.You could call
SetProgressBarIndicatorLength
through reflection, or cycle one of the properties that causes it to be called. This is lame, but it doesn't look like theProgressBar
was designed so that theMaximum
andMinimum
would be changed in mid-progress.Regardless of which method you choose, you can figure out when the
Maximum
property changes by usingDependencyPropertyDescriptor.AddValueChanged
:I was having trouble getting the solution here to work, but I found another work around. My progress bar wouldn't update as I changed the datasource of my object (11 of 11 would change to 10 of 10 and freeze the progress bar), and realized that I didn't need to update maximum value at all.
Instead I used a converter on the value to convert it to a percent, and set my maximum at 100. The result displays the same, but without the bug for changing maximum value.