我有一个控件显示进度条。
我希望进度条的颜色能够有效地成为当前背景颜色的加强版,例如:
- 如果背景是浅黄色,我想让进度条变成深黄色。
- 如果背景是浅绿色,我想让进度条变成深绿色。
- 等等。
在WPF中是否有可能实现这一点?
请注意,我不知道谁为我设置了背景颜色,因此无法手动设置它。
更新
我应该澄清一下,有些父控件在XAML中将Background
设置为transparent
。
但是,在视觉树中,这仅意味着Background
会传递给所有子元素。
我有一个控件显示进度条。
我希望进度条的颜色能够有效地成为当前背景颜色的加强版,例如:
在WPF中是否有可能实现这一点?
请注意,我不知道谁为我设置了背景颜色,因此无法手动设置它。
更新
我应该澄清一下,有些父控件在XAML中将Background
设置为transparent
。
但是,在视觉树中,这仅意味着Background
会传递给所有子元素。
class BackgroundConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var background = value as SolidColorBrush;
if (background.Color == Colors.LightYellow) return new SolidColorBrush(Colors.Yellow);
if (background.Color == Colors.LightGreen) return new SolidColorBrush(Colors.Green);
return new SolidColorBrush(Colors.White);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
XAML:
<Window.Resources>
<local:BackgroundConverter x:Key="BackgroundConverter"/>
</Window.Resources>
<ProgressBar Background="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=Background,
Converter={StaticResource BackgroundConverter}}"/>
或者采用后一种方式只使用XAML:
<ProgressBar>
<ProgressBar.Style>
<Style TargetType="ProgressBar">
<Setter Property="Background" Value="White"/>
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=Background}" Value="LightYellow">
<Setter Property="Background" Value="Yellow"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=Background}" Value="LightGreen">
<Setter Property="Background" Value="Green"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ProgressBar.Style>
</ProgressBar>
ProgreeBar
的背景将与背景颜色相同。我认为他需要提供一个转换器,根据呈现的背景颜色调整颜色。 - Tomtom <vm:ProgressBar x:Name="ProgressBar"
Grid.RowSpan="3"
Width="140"
Height="120"
Margin="12"
Panel.ZIndex="5"
Padding="10"
DataContext.ProgressBarVisibility,
RelativeSource={RelativeSource AncestorType=Window,
AncestorLevel=1}}"
d:DesignerVisibility="False">
<vm:ProgressBar.Foreground>
<RadialGradientBrush Center="0.5,0.5" GradientOrigin="0.4,0.4" RadiusX="0.5" RadiusY="0.5">
<RadialGradientBrush.GradientStops>
<GradientStop Offset="0" Color="Transparent" />
<GradientStop Offset="1" Color="{Binding Path=FColor}" />
</RadialGradientBrush.GradientStops>
</RadialGradientBrush>
</vm:ProgressBar.Foreground>
</vm:ProgressBar>
d:DesignerVisibility="False"
。 - Contango