XAML случайное изменение цвета фона кнопок - PullRequest
0 голосов
/ 27 апреля 2018

Я хочу изменить случайные кнопки. Но вопрос в том, что я хочу сделать это со случайными числами смены цветов.

Теперь я изменяю это так, но я хочу динамически менять числа меняющихся цветов.

private void ChangeColor()
{
  Random rand = new Random();
  Color[] colors = new Color[]
      {
          Colors.Red,
          Colors.Blue,
          Colors.Green,
      };


  But0_1.Background = new SolidColorBrush(colors[rand.Next(0, 3)]);
  But0_1.Background = new SolidColorBrush(colors[rand.Next(0, 3)]);
  But0_2.Background = new SolidColorBrush(colors[rand.Next(0, 3)]);
  But0_3.Background = new SolidColorBrush(colors[rand.Next(0, 3)]);
  But0_4.Background = new SolidColorBrush(colors[rand.Next(0, 3)]);
  But0_5.Background = new SolidColorBrush(colors[rand.Next(0, 3)]);
  But0_6.Background = new SolidColorBrush(colors[rand.Next(0, 3)]);
  But0_7.Background = new SolidColorBrush(colors[rand.Next(0, 3)]);
}

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Я пока не могу комментировать, но метод RandomInt (), предоставленный 3xGuy, всегда будет выдавать случайный серый цвет, потому что все 3 байта будут одинаковыми. По сути, это та же проблема, описанная здесь: Случайное число в цикле

Сделайте экземпляр Random локальным для CreateColor и удалите метод RandomInt ():

private static SolidColorBrush CreateColor()
{
    var random = new Random();

    var r = Convert.ToByte(random.Next(0, 255));
    var g = Convert.ToByte(random.Next(0, 255));
    var b = Convert.ToByte(random.Next(0, 255));

    return new SolidColorBrush(Color.FromRgb(r, g, b));
}
0 голосов
/ 27 апреля 2018

Вы можете сделать что-то вроде:

    private Random _random;

    public MainWindow()
    {
        InitializeComponent();
        _random = new Random();
    }

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        var buttons = GetButtonsToChange();

        foreach (var button in buttons)
        {
            if (button != null)
            {
                button.Background = CreateColor();
            }
        }
    }

    private Button[] GetButtonsToChange()
    {
        var amountOfButtons = RandBetween(0, 5);// <== 0 for none 5 because i only have 4 buttons and RandBetween is less than
        var listOfIndexs = new List<ButtonNumbering>();
        var listOfButtons = new List<Button>();
        for (int i = 1; i <= amountOfButtons; i++)
        {
            var buttonItem = new ButtonNumbering(i,RandBetween(1,4));
            var alreadyHasButton = listOfIndexs.Select(x => x.Number).Contains(buttonItem.Number);
            if (alreadyHasButton)
            {
                while (alreadyHasButton)
                {
                    var newRandomNumber = RandBetween(1, 5);
                    buttonItem.Number = RandBetween();
                    alreadyHasButton = listOfIndexs.Select(x => x.Number).Contains(buttonItem.Number);
                }
            }
            listOfIndexs.Add(buttonItem);
            var buttonName = $"Button{buttonItem.Number}";//<= the names of the buttons are Button1 Button2 Button3 Button4
            var button = (Button)FindName(buttonName);
             listOfButtons.Add(button);
        }

        return listOfButtons.ToArray();
    }

    private SolidColorBrush CreateColor(int bottom=0, int top=255)
    {
        var red = RandBetween(bottom,top);
        var green = RandBetween(bottom,top);
        var blue = RandBetween(bottom,top);

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

    private byte RandBetween(int bottom=0, int top=255)
    {
        var randomNumber = Convert.ToByte(_random.Next(bottom, top));
        return randomNumber;
    }

Я обновил ответ, поскольку он создавал один и тот же цвет для всех них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...