Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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
C# 属性上背景色之间的淡入淡出已更改_C#_.net_Wpf - Fatal编程技术网

C# 属性上背景色之间的淡入淡出已更改

C# 属性上背景色之间的淡入淡出已更改,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

我想知道,如何使两种背景色之间的过渡更平滑。有可能进行某种淡入淡出过渡吗

我创建了这个小示例项目来说明这种行为

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: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,您可以自己计算两种颜色之间的线性插值。请参见以下链接:

以下是一些与动画相关的链接:


您可以定义一个故事板,该故事板具有一个彩色动画,该动画定义了“从”和“到”颜色,即您希望在两者之间平滑插值的颜色

动画应以SolidColorBrush的颜色属性为目标,该属性可以是定义为资源的属性,然后由控件引用(即标签使用{StaticResource xxxxxx}如果背景包含SolidColorBrush笔刷,则动画可以直接以标签中的背景为目标(…通常情况下是这样的…但这完全取决于控件模板的设计方式)

然后,您需要开始并暂停动画,并寻找动画中与您的百分比相对应的位置。例如,您可以将持续时间设置为100秒,然后您可以简单地使用百分比值作为时间跨度中的秒数。(可能必须将IsControl设为true)

加载控件时,将启动并暂停动画,然后与百分比更改同步更改搜索位置

请注意,让动画一直运行可能不是一个好主意,只是将范围值映射到表示颜色,但这是另一个选项

否则,请坚持使用valueconverter,您可以自己计算两种颜色之间的线性插值。请参见以下链接:

以下是一些与动画相关的链接:


为什么不使用受控情节串连板动画?(我认为这会拯救你的生命)要看一看,有没有相关的链接?可以是情节提要,也可以用视觉状态管理器设置一些视觉状态。你可以通过使用Expression Blend或手动使用适当的标记来交互实现。为什么不使用受控情节提要动画?(我想这会挽救你的生命)要看一看,有没有相关链接?可以是故事板,也可以用视觉状态管理器设置一些视觉状态。你可以通过使用Expression Blend或使用适当的标记以交互方式完成。
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();
    }
}