C# 属性上背景色之间的淡入淡出已更改
我想知道,如何使两种背景色之间的过渡更平滑。有可能进行某种淡入淡出过渡吗 我创建了这个小示例项目来说明这种行为 MainWindow.xamlC# 属性上背景色之间的淡入淡出已更改,c#,.net,wpf,C#,.net,Wpf,我想知道,如何使两种背景色之间的过渡更平滑。有可能进行某种淡入淡出过渡吗 我创建了这个小示例项目来说明这种行为 MainWindow.xaml <Window x:Class="FadeTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Co
<Window x:Class="FadeTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Converter="clr-namespace:FadeTest" Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Converter:BackgroundPercentConverter x:Key="backgroundPercentConverter"/>
</Window.Resources>
<DockPanel>
<Label Content="{Binding PercentComplete}" Height="100" Width="200"
DockPanel.Dock="Top" Foreground="White" FontSize="28"
Background="{Binding PercentComplete, Converter={StaticResource backgroundPercentConverter}}"
HorizontalContentAlignment="Center" VerticalContentAlignment="Center" />
<Button DockPanel.Dock="Bottom" Click="Button_Click" Width="100" Height="32">Click</Button>
</DockPanel>
MyClass.cs
class MyClass : INotifyPropertyChanged
{
private int _percentComplete;
public int PercentComplete
{
get { return _percentComplete; }
set
{
if (value >= 10)
value = 0;
_percentComplete = value;
OnPropertyChanged("PercentComplete");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(String propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Background.cs
public class BackgroundPercentConverter : IValueConverter
{
private static readonly SolidColorBrush[] MyColors = new[]
{
new SolidColorBrush(Color.FromRgb(229, 29, 37)),
new SolidColorBrush(Color.FromRgb(252, 52, 0)),
new SolidColorBrush(Color.FromRgb(253, 81, 0)),
new SolidColorBrush(Color.FromRgb(255, 101, 1)),
new SolidColorBrush(Color.FromRgb(255, 133, 0)),
new SolidColorBrush(Color.FromRgb(254, 175, 0)),
new SolidColorBrush(Color.FromRgb(221, 182, 3)),
new SolidColorBrush(Color.FromRgb(173, 216, 2)),
new SolidColorBrush(Color.FromRgb(138, 191, 62)),
new SolidColorBrush(Color.FromRgb(47, 154, 69))
};
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((int)value < 0 || (int)value >= MyColors.Length)
return MyColors[0];
return MyColors[(int)value];
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class BackgroundPercentConverter:IValueConverter
{
私有静态只读SolidColorBrush[]MyColors=new[]
{
新的SolidColorBrush(颜色来自RGB(229,29,37)),
新的SolidColorBrush(颜色来自RGB(252,52,0)),
新的SolidColorBrush(颜色来自RGB(253,81,0)),
新的SolidColorBrush(Color.FromRgb(255、101、1)),
新的SolidColorBrush(Color.FromRgb(255,133,0)),
新的SolidColorBrush(Color.FromRgb(254,175,0)),
新的SolidColorBrush(颜色来自RGB(221、182、3)),
新的SolidColorBrush(颜色来自RGB(173216,2)),
新的SolidColorBrush(颜色来自RGB(13819162)),
新的SolidColorBrush(颜色来自RGB(47、154、69))
};
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
如果((int)值<0 | |(int)值>=MyColors.Length)
返回MyColors[0];
返回MyColors[(int)值];
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
您可以定义一个具有彩色动画的故事板,该动画定义了“起始”和“结束”颜色,即您希望在两者之间平滑插值的颜色
动画应以SolidColorBrush的颜色属性为目标,该属性可以是定义为资源的属性,然后由控件引用(即标签使用{StaticResource xxxxxx}如果背景包含SolidColorBrush笔刷,则动画可以直接以标签中的背景为目标(…通常情况下是这样的…但这完全取决于控件模板的设计方式)
然后,您需要开始并暂停动画,并寻找动画中与您的百分比相对应的位置。例如,您可以将持续时间设置为100秒,然后您可以简单地使用百分比值作为时间跨度中的秒数。(可能必须将IsControl设为true)
加载控件时,将启动并暂停动画,然后与百分比更改同步更改搜索位置
请注意,让动画一直运行可能不是一个好主意,只是将范围值映射到表示颜色,但这是另一个选项
否则,请坚持使用valueconverter,您可以自己计算两种颜色之间的线性插值。请参见以下链接:
public class BackgroundPercentConverter : IValueConverter
{
private static readonly SolidColorBrush[] MyColors = new[]
{
new SolidColorBrush(Color.FromRgb(229, 29, 37)),
new SolidColorBrush(Color.FromRgb(252, 52, 0)),
new SolidColorBrush(Color.FromRgb(253, 81, 0)),
new SolidColorBrush(Color.FromRgb(255, 101, 1)),
new SolidColorBrush(Color.FromRgb(255, 133, 0)),
new SolidColorBrush(Color.FromRgb(254, 175, 0)),
new SolidColorBrush(Color.FromRgb(221, 182, 3)),
new SolidColorBrush(Color.FromRgb(173, 216, 2)),
new SolidColorBrush(Color.FromRgb(138, 191, 62)),
new SolidColorBrush(Color.FromRgb(47, 154, 69))
};
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((int)value < 0 || (int)value >= MyColors.Length)
return MyColors[0];
return MyColors[(int)value];
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}