2009-03-17 11 views
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が最大バインディングで更新されない

基本的に、ProgressBarは値が変更されるまで再描画されません。したがって、2本のチューブがあり、1本が故障した場合、さらに20本のチューブを追加しても、NumFailedが変更されるまでバーは半分まで満たされています。私はNumFailedプロパティの偽の通知を追加しようとしましたが、値が変更されていないので、明らかに機能しません。

アイデア?

答えて

4

バーのサイズは私的方法ProgressBar.SetProgressBarIndicatorLengthで計算されているようです。 OnValueChangedOnTrackSizeChanged、およびOnIsIndeterminateChangedからのみ呼び出されます。

リフレクションによってSetProgressBarIndicatorLengthに電話をかけることも、それを呼び出すプロパティの1つを繰り返すこともできます。これは不自由ですが、MaximumMinimumが途中で変更されるようにProgressBarが設計されたようには見えません。私は仕事にここに解決策を得るトラブルを抱えていたが

DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(ProgressBar.MaximumProperty, typeof(ProgressBar))); 
if (dpd != null) 
{ 
    dpd.AddValueChanged(myProgressBar, delegate 
    { 
     // handle Maximum changes here 
    }); 
} 
+0

私はこれをトリガするために簡単なサブクラスを使用できますか? – Thomas

+0

実際、サブクラス化する必要はなく、MaximumPropertyのDependencyPropertyDescriptorを取得してAddValueChangedを呼び出すことができます。これを私のポストに追加します。 –

+0

ありがとう、私はIsIndeterminate true/falseをデリゲート内でトグルしました。素晴らしい仕事。 – Thomas

2

私の周りに別の仕事を見つけました:DependencyPropertyDescriptor.AddValueChangedを使用してMaximumプロパティが変更されたときに関係なく、選択した方法の

、あなたが把握することができます。オブジェクトのデータソースを変更したとき(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}}" /> 
+0

私はそれが好きです。 – Thomas

関連する問題