2016-10-20 5 views
-2

Итак, я пытаюсь сделать 8 кругов, которые имеют разные цвета заливки, и все имеют разные скорости мигания. До сих пор я мог заставить их моргать с разной скоростью, но у меня возникают проблемы с тем, чтобы у них были разные цвета. Мой код до сих пор:WPF Изменение цвета заливки эллипса

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)); 
     } 
    } 

И мой 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"/> 

Примечание: Я знаю, что могу сжать/изменить мой код, чтобы сделать это аккуратнее и лучше, но сейчас я просто хочу, чтобы получить цвета работы.

Так что в настоящее время код меняет цвет заливки все Элементы эллипса, но я хочу изменить его, чтобы просто повлиять на каждый круг. Как мне это сделать?

Edit: Для тех, кто запутался, что Im пытается спросить, я не знаю, как индивидуально изменить цвет заливки каждого круга.

+1

_ "У меня возникли проблемы с созданием их все имеют разные цвета" _ - пожалуйста, более конкретно. Какая проблема, _exactly_. Что вы пробовали с точки зрения изменения кода, который вы показываете выше, чтобы он обрабатывал каждый эллипс отдельно? Вам действительно нужно восемь разных эллипсов в вашем коде, чтобы проиллюстрировать проблему? Пожалуйста, отредактируйте свой пост, чтобы он включал только хороший [mcve], который наглядно иллюстрирует ваш вопрос и подробное, точное объяснение конкретной проблемы. –

+0

* «Я не знаю, как индивидуально изменить цвет заливки каждого круга» * - как вы хотите достичь этого? Через код-за или через Xaml? * Когда * вы хотите, чтобы это произошло? Ваш вопрос по-прежнему очень неясен. –

ответ

1

Я думаю, ваша ошибка здесь в том, что объект Random воссоздается каждый раз. Попробуйте поместить его в поле и инициализировать его один раз или отправив его в качестве параметра в метод SetEllipseColor.

Поскольку генераторы случайных чисел фактически не являются случайными, они получают свои «начальные» случайные значения из начального значения, часто текущее время. Это означает, что если вы создадите кучу новых случайных экземпляров за очень короткое время, они, скорее всего, получат одно и то же семя и, таким образом, одно и то же значение.

(В более общем плане, «Появляются» и «SetEllipseColor» не очень хорошие имена методов. Первая из них является расплывчатым и последний фактически не описать, что делает этот метод.)

+0

Что значит «Попробуйте положить это в поле и инициализировать его один раз»? Извините, я довольно новичок в C# и WPF –

+0

Поле в вашем классе - вид переменной, но привязанный ко всему объекту (один экземпляр его, разум), а не только метод. Вы можете попробовать следующее: 'private readonly Random _random = new Random();' – robhol

+0

, так что это связано с изменением цвета? –

3

Установить экземпляр класса Random на уровне класса, проверьте приведенный ниже пример, нажав на Button, который говорит 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; 
     } 
    } 
}