WPF: динамические действия в шаблоне - PullRequest
1 голос
/ 21 июля 2010

Я определил шаблон элемента управления для индикатора выполнения, чтобы он выглядел как термометр ... теперь я хочу, чтобы он менял свой цвет при достижении определенного значения (например, когда индикатор выполнения имеет значение 70, его цвет должен измениться на желтый)

В настоящее время цвет PART_Indicator привязан к цвету фона индикатора выполнения .. Цвет фона изменяется в обработчике событий ValueChanged, поэтому цвет индикатора тоже меняется ... есть ли возможность сделать это в шаблоне только, так что мне не нужно использовать EventChanged Eventhandler?

    <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>

Ответы [ 2 ]

0 голосов
/ 21 июля 2010

больше или меньше - я бы написал пользовательский 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();
    }
}

Этот код только с моей головы и не был проверен, но он должен показать принципы.

0 голосов
/ 21 июля 2010
<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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...