C# 改变椭圆填充颜色的WPF

C# 改变椭圆填充颜色的WPF,c#,wpf,C#,Wpf,所以我试着做8个圆圈,它们都有不同的填充颜色,都有不同的闪烁速度。到目前为止,我已经能够让它们以不同的速度闪烁,但我很难让它们都有不同的颜色。到目前为止,我的代码是: private void Appear(Ellipse element, double duration, Brush colour) { element.Fill = colour; DoubleAnimation db = new DoubleAnimation();

所以我试着做8个圆圈,它们都有不同的填充颜色,都有不同的闪烁速度。到目前为止,我已经能够让它们以不同的速度闪烁,但我很难让它们都有不同的颜色。到目前为止,我的代码是:

    private void Appear(Ellipse element, double duration, Brush colour)
    {
        element.Fill = colour;
        DoubleAnimation db = new DoubleAnimation();
        db.From = 0.0;
        db.To = 1.0;
        db.Duration = new Duration(TimeSpan.FromSeconds(duration));
        db.RepeatBehavior = RepeatBehavior.Forever;
        element.BeginAnimation(Ellipse.OpacityProperty, db);
    }

    private Brush SetEllipseColour(Ellipse element)
    {
        Random rnd = new Random();
        int red = rnd.Next(0, 255);
        int green = rnd.Next(0, 255);
        int blue = rnd.Next(0, 255);

        Brush fillColour = new SolidColorBrush(Color.FromRgb((byte)red, (byte)green, (byte)blue));
        return fillColour;
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {

        List<Ellipse> elements = new List<Ellipse>();
        elements.Add(Circle1);
        elements.Add(Circle2);
        elements.Add(Circle3);
        elements.Add(Circle4);
        elements.Add(Circle5);
        elements.Add(Circle6);
        elements.Add(Circle7);
        elements.Add(Circle8);

        Random rnd = new Random();

        foreach (Ellipse element in elements)
        {
            int r = rnd.Next(1, 10);
            double duration = (Double)r / 10;
            Appear(element, duration, SetEllipseColour(element));
        }
    }
private void出现(椭圆元素,双持续时间,画笔颜色)
{
元素。填充=颜色;
DoubleAnimation db=新的DoubleAnimation();
db.From=0.0;
db.To=1.0;
db.Duration=新的持续时间(TimeSpan.FromSeconds(持续时间));
db.RepeatBehavior=RepeatBehavior.Forever;
元素。初始值(椭圆。不透明属性,db);
}
专用笔刷设置椭圆色(椭圆元素)
{
随机rnd=新随机();
int red=rnd.Next(0255);
绿色整数=rnd.Next(0255);
int blue=rnd.Next(0,255);
笔刷填充颜色=新的SolidColorBrush(颜色为RGB((字节)红色,(字节)绿色,(字节)蓝色));
返回颜色;
}
私有无效按钮1\u单击(对象发送者,路由目标)
{
列表元素=新列表();
元素。添加(圆圈1);
元素。添加(圆圈2);
元素。添加(圆圈3);
元素。添加(圆圈4);
元素。添加(圆圈5);
元素。添加(圆圈6);
元素。添加(圆圈7);
元素。添加(圆圈8);
随机rnd=新随机();
foreach(元素中的椭圆元素)
{
int r=rnd.Next(1,10);
双倍持续时间=(双倍)r/10;
出现(元素、持续时间、SetEllipseColour(元素));
}
}
我的WPF:

<Canvas Margin="10">
            <Ellipse
                x:Name="Circle1"
                Fill="Black"
                Height="100"
                Width="100"/>
            <Ellipse
                x:Name="Circle2"
                Fill="Black"
                Height="100"
                Width="100"
                Margin="120,0,0,0"/>
            <Ellipse
                x:Name="Circle3"
                Fill="Black"
                Height="100"
                Width="100"
                Margin="240,0,0,0"/>
            <Ellipse
                x:Name="Circle4"
                Fill="Black"
                Height="100"
                Width="100"
                Margin="360,0,0,0"/>
            <Ellipse
                x:Name="Circle5"
                Fill="Black"
                Height="100"
                Width="100"
                Margin="0,120,0,0"/>
            <Ellipse
                x:Name="Circle6"
                Fill="Black"
                Height="100"
                Width="100"
                Margin="120,120,0,0"/>
            <Ellipse
                x:Name="Circle7"
                Fill="Black"
                Height="100"
                Width="100"
                Margin="240,120,0,0"/>
            <Ellipse
                x:Name="Circle8"
                Fill="Black"
                Height="100"
                Width="100"
                Margin="360,120,0,0"/>
        </Canvas>
        <Button x:Name="button1" Content="Start" Width="80" Height="20" Margin="0,200,0,0" Click="button1_Click"/>

注意:我知道我可以压缩/更改代码,使其更整洁或更好,但现在我只想让颜色正常工作

因此,目前我的代码更改了所有椭圆元素的填充颜色,但我想将其更改为仅影响每个圆。我该怎么做呢

编辑:
对于那些对我想问的问题感到困惑的人,我不知道如何单独更改每个圆的填充颜色。

我认为你的错误在于每次都在重新创建随机对象。尝试将其放入字段并初始化一次,或者将其作为参数发送到SetEllipseColor方法

由于随机数生成器实际上不是随机的,所以它们从种子值(通常是当前时间)导出其“初始”随机值。这意味着,如果您在很短的时间内创建了一组新的随机实例,它们很可能以相同的种子结束,从而获得相同的值


(更一般地说,“出现”和“SetEllipseColor”不是很好的方法名称。前者是模糊的,后者实际上没有描述该方法在做什么。)

在类级别设置
随机
类的实例,通过单击显示Blink Em的
按钮检查下面的示例!动画将被触发

XAML

<Window x:Class="Blink.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Blink"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525" WindowState="Maximized">
    <Grid VerticalAlignment="Center" HorizontalAlignment="Center">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Button x:Name="BlinkEm" Content="Blink Em!" Height="30" Click="BlinkEm_Click"/>
        <StackPanel x:Name="Container" Orientation="Horizontal" Loaded="Container_Loaded" Grid.Row="1"/>
    </Grid>
</Window>

背后的代码

namespace Blink
{
    using System;
    using System.Collections.Generic;
    using System.Windows;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public Random random = new Random();

        public MainWindow()
        {
            InitializeComponent();
        }

        public List<Ellipse> CreateCircles(int count)
        {
            List<Ellipse> circles = new List<Ellipse>();
            for (int i = 0; i < count; i++)
            {
                var circle = new Ellipse
                {
                    Height = 100,
                    Width = 100,
                    Margin = new Thickness(10),
                    Fill = Brushes.SkyBlue
                };

                circles.Add(circle);
            }

            return circles;
        }

        public void AddCircles()
        {
            var circles = this.CreateCircles(8);
            foreach (var circle in circles)
            {
                Container.Children.Add(circle);
            }
        }

        private void Container_Loaded(object sender, RoutedEventArgs e)
        {
            AddCircles();
        }

        private void BlinkEm_Click(object sender, RoutedEventArgs e)
        {
            foreach (Ellipse circle in Container.Children)
            {
                circle.Fill = GetRandomColor();
                circle.BeginAnimation(Ellipse.OpacityProperty, GetBlinkAnimation());
            }
        }

        public Brush GetRandomColor()
        {
            var red = Convert.ToByte(random.Next(0, 255));
            var green = Convert.ToByte(random.Next(0, 255));
            var blue = Convert.ToByte(random.Next(0, 255));

            return new SolidColorBrush(Color.FromRgb(red, green, blue));
        }

        public DoubleAnimation GetBlinkAnimation()
        {
            var duration = random.NextDouble();
            var animation = new DoubleAnimation
            {
                From = 0.0,
                To = 1.0,
                Duration = new Duration(TimeSpan.FromSeconds(duration)),
                RepeatBehavior = RepeatBehavior.Forever
            };

            return animation;
        }
    }
}
名称空间闪烁
{
使用制度;
使用System.Collections.Generic;
使用System.Windows;
使用System.Windows.Media;
使用System.Windows.Media.Animation;
使用System.Windows.Shapes;
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共随机=新随机();
公共主窗口()
{
初始化组件();
}
公共列表CreateCircles(整数计数)
{
列表圈=新列表();
for(int i=0;i
你说的“尝试将其放入字段并初始化一次”是什么意思?对不起,我对类中的C#和WPFA字段还比较陌生——有点像一个变量,但作用域是整个对象(注意,它的一个实例),而不仅仅是一个方法。您可以尝试这样做:
private readonly Random\u Random=new Random()