2010-07-21 84 views
1

我爲進度條定義了一個控制模板,使它看起來像一個溫度計......現在我希望它在達到某個值時更改其顏色(例如,當進度條值爲70,其顏色應變爲黃色)WPF:模板中的動態操作

當前,PART_Indicator的顏色與進度條的背景顏色綁定在一起。backgroundColor在ValueChanged事件句柄中更改,因此指示器的顏色也發生變化...有沒有可能在模板中做到這一點,所以我不需要使用ValueChanged事件處理程序?

<ControlTemplate x:Key="myThermometer" TargetType="{x:Type ProgressBar}"> 
    <ControlTemplate.Resources> 
     <RadialGradientBrush x:Key="brushBowl" GradientOrigin="0.5 0.5"> 
      <GradientStop Offset="0" Color="Pink" /> 
      <GradientStop Offset="1" Color="Red" /> 
     </RadialGradientBrush> 
    </ControlTemplate.Resources> 
    <Canvas> 
     <Path Name="PART_Track" Stroke="Black" StrokeThickness="5" Grid.Column="0"> 
      <Path.Data> 
       <CombinedGeometry GeometryCombineMode="Union"> 
        <CombinedGeometry.Geometry1> 
         <RectangleGeometry Rect="10,40,130,20" RadiusX="5" RadiusY="5"/> 
        </CombinedGeometry.Geometry1> 
        <CombinedGeometry.Geometry2> 
         <EllipseGeometry Center="10,50" RadiusX="20" RadiusY="20"/> 
        </CombinedGeometry.Geometry2> 
       </CombinedGeometry> 
      </Path.Data> 
     </Path> 

     <Path Fill="{TemplateBinding Background}"> 
      <Path.Data> 
       <EllipseGeometry Center="10,50" RadiusX="17" RadiusY="17"/> 
      </Path.Data> 
     </Path> 

     <Path Name="PART_Indicator" Fill="{TemplateBinding Background}" Grid.Column="0"> 
      <Path.Data> 
       <RectangleGeometry Rect="22,43,115,15" RadiusX="5" RadiusY="5"/> 
      </Path.Data> 
     </Path> 

     <Canvas Canvas.Top="35" Canvas.Right="375"> 
      <Canvas.RenderTransform> 
       <RotateTransform CenterX="120" CenterY="120" Angle="-270" /> 
      </Canvas.RenderTransform> 
      <TextBlock FontWeight="Bold" FontSize="16" Foreground="Black" Text="{TemplateBinding Tag}"/> 
     </Canvas> 
    </Canvas>  
</ControlTemplate> 

回答

0
<ProgressBar x:Name="progressBar" Background="{Binding RelativeSource={RelativeSource Self},Path=Value,Converter={StaticResource IntToBrushConverter}}" /> 


public class IntToBrushConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     double val = (double)value; 
     if (val > 50) 
      return Brushes.Blue; 
     else 
      return Brushes.Green; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new Exception("Not Implemented"); 
    } 

    #endregion 
} 
0

或多或少 - 我會寫一個自定義ValueConverter你的進度值轉換爲顏色,並使用該轉換器進度條的填充綁定。

XAML:

Fill="{TemplateBinding Progress, 
     Converter={StaticResource ProgressToColorConverter}}" 

代碼:

[ValueConversion(typeof(int), typeof(Color))] 
public class ProgressToColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     int progress = (int)value; 
     if (progress < 60) 
      return Color.Green; 
     else 
      return Color.Red; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

此代碼只是從我的頭頂,並沒有經過測試,但它應該表現出的原則。