C# 改变椭圆填充颜色的WPF
所以我试着做8个圆圈,它们都有不同的填充颜色,都有不同的闪烁速度。到目前为止,我已经能够让它们以不同的速度闪烁,但我很难让它们都有不同的颜色。到目前为止,我的代码是:C# 改变椭圆填充颜色的WPF,c#,wpf,C#,Wpf,所以我试着做8个圆圈,它们都有不同的填充颜色,都有不同的闪烁速度。到目前为止,我已经能够让它们以不同的速度闪烁,但我很难让它们都有不同的颜色。到目前为止,我的代码是: private void Appear(Ellipse element, double duration, Brush colour) { element.Fill = colour; DoubleAnimation db = new DoubleAnimation();
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()那么这和颜色的变化有什么关系呢?你说得对