Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF:使用IMultiValueConverter更改进度条颜色_Wpf_Progress Bar_Imultivalueconverter - Fatal编程技术网

WPF:使用IMultiValueConverter更改进度条颜色

WPF:使用IMultiValueConverter更改进度条颜色,wpf,progress-bar,imultivalueconverter,Wpf,Progress Bar,Imultivalueconverter,好的,我的视图模型中有以下属性: public double Progress { get { return _progress; } set { _progress= value; OnPropertyChanged(); } } public bool IsChecked { get { return _isChecked; } set { _isChecked = value;

好的,我的视图模型中有以下属性:

public double Progress
{
    get { return _progress; }
    set
    {
        _progress= value;
        OnPropertyChanged();
    }
}

public bool IsChecked
{
    get { return _isChecked; }
    set
    {
        _isChecked = value;
        OnPropertyChanged();
    }
}
正如您所看到的,这个工具
INotifyPropertyChanged

这是我的
进度条

<ProgressBar Name="progressBarColumn"
             Minimum="0"
             Maximum="100"
             Value="{Binding Progress, UpdateSourceTrigger=PropertyChanged}" 
             Width="{Binding Path=Width, ElementName=ProgressCell}" 
             Style="{StaticResource CustomProgressBar2}"/>
所以这很好,我的
进度条
颜色是
蓝色
,并填充
灰色
颜色

现在我想补充两件事,但不知道什么时候: 1.当我的
进度条
达到
100的
时,我希望它
背景
变成
绿色

  • 当我的
    属性
    被调用
    被选中时
    False
    我希望我的
    背景
    变成
    红色
  • 在此之前,我有一个
    IMultiValueConverter

    public class ProgressToPropgressBarBackgroundConverter : IMultiValueConverter
        {
            public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
            {
                // Do my stuff
            }
    
            public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
    
    问题是我不知道在哪里添加我的
    转换器以及如何添加

    编辑:


    您的逻辑非常简单,您可以避免使用转换器,只需在您的样式中使用触发器:

    <Style.Triggers>
        <DataTrigger Binding=“{Binding Progress}” Value=“100”>
            <Setter Property=“Background” Value=“Green” />
        </DataTrigger>
        <DataTrigger Binding=“{Binding IsChecked}” Value=“True”>
            <Setter Property=“Background” Value=“Red” />
        </DataTrigger>
    </Style.Triggers>
    
    
    
    然后需要更新控件模板以正确地尊重控件的后台属性。您可以为此使用TemplateBinding:

                    <Border Name="PART_Track" 
                            CornerRadius="0" 
                            Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding Background}"
                            BorderThickness="1"/>
                    <Border Name="PART_Indicator" 
                            CornerRadius="0" 
                            Background="{TemplateBinding Foreground}" 
                            BorderBrush="{TemplateBinding Foreground}" 
                            BorderThickness="1" 
                            HorizontalAlignment="Left" />
    
    
    
    如果需要相同的蓝色和灰色默认颜色,请将它们添加到样式中:

    <Setter Property=“Background” Value=“Blue”/>
    <Setter Property=“Foreground” Value=“Gray”/>
    
    
    
    您不需要转换器,您的样式中的DataTriggers将执行此操作请参见我的编辑,我添加了两个DataTriggers,但它们都不工作请参见我的编辑,根据您的编辑,除了值为100时,所有都工作正常,在这种情况下,颜色不会更改为黑色。看起来您的绑定是错误的,我想你可能想要{relativesourceself}。但是使用常规触发器(不是DataTrigger)或绑定到基础属性(如我的回答中所述)实际上更容易。我将其更改为,并尝试Value=“100.0”,因为这是一个带1个小数点的双精度,但我仍然看不到这个颜色,可能是try Value=“{x:double 100}”,否则,我会在视图模型中添加一个bool属性,并触发WPF中不支持的Double,我会在我的VM中添加一些值。
                    <Border Name="PART_Track" 
                            CornerRadius="0" 
                            Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding Background}"
                            BorderThickness="1"/>
                    <Border Name="PART_Indicator" 
                            CornerRadius="0" 
                            Background="{TemplateBinding Foreground}" 
                            BorderBrush="{TemplateBinding Foreground}" 
                            BorderThickness="1" 
                            HorizontalAlignment="Left" />
    
    <Setter Property=“Background” Value=“Blue”/>
    <Setter Property=“Foreground” Value=“Gray”/>