Есть ли более быстрый способ присвоения изображения множеству кнопок? - PullRequest
0 голосов
/ 25 мая 2019

У меня есть приложение Windows Forms, которому нужно назначить изображение для всех 100 кнопок, проблема в том, что мне нужно делать это каждый раз случайно ... Есть ли более быстрый способ сделать это?

Моя первая идея состояла в том, чтобы использовать базовый метод присвоения этого изображения переменной, а затем присвоения изображения кнопке:

Bitmap P_Farm = new Bitmap(@"IMAGE PATH.jpeg");

this.button1.Image = P_Farm;

Но проблема в том, что мне нужно будет сделать это длявсе 100 кнопок.

this.button1.Image = P_Farm; // "P_Farm is just the path to the image"
this.button2.Image = P_Farm;
this.button3.Image = P_Farm;
this.button4.Image = P_Farm;

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

this.button1.Image = Z_Farm;
this.button2.Image = C_Farm;
this.button3.Image = P_Farm;
this.button4.Image = P_Farm;

, затем

this.button1.Image = P_Farm;
this.button2.Image = P_Farm;
this.button3.Image = Z_Farm;
this.button4.Image = Z_Farm;

Мне было интересно, можно ли было сделать что-то вроде чтения каждой строки в текстовом файле, но вместо того, чтобы строка менялась с каждымпопробуйте, кнопка изменится

int i = 0;

while (true) // Something like this loop but changing not the line, but the button
{
    this.button[i].image = P_Farm; // this obviously doesn't work
    I++;
}

Надеюсь, это имеет смысл

Спасибо большое!

1 Ответ

2 голосов
/ 25 мая 2019

Вы также можете просмотреть все элементы управления в своей форме, найти кнопки и изменить их изображение таким образом. Конечно, вы не хотите менять их все. Обычно я задаю число для свойства Tag:

        foreach (Control control in Controls)
        {
            if (control is Button theButton && (int)theButton.Tag == 5)
            {
                theButton.Image = P_Farm;
            }
        }

Это не будет работать, если у вас есть панели с кнопками, которые вы тоже хотите изменить. Вам придется написать рекурсивную функцию, которая включает в себя все возможные контейнеры в вашей форме, такие как панели. Если вы хотите изменить все кнопки в контейнере, например на панели, вы можете изменить только строку foreach на что-то вроде foreach (Control control in panel.Controls).

В будущем, когда вы решите, что не все кнопки будут иметь одинаковое изображение, вы можете установить изображение на основе свойства tag, например:

        foreach (Control control in Controls)
        {
            if (control is Button theButton && (int)theButton.Tag >= 5)
            {
                switch ((int) theButton.Tag)
                {
                    case 100:
                        theButton.Image = P_Farm;
                        break;
                    case 101:
                        theButton.Image = Z_Farm;
                        break;
                }
            }
        }

Поскольку мы предполагаем, что у всех кнопок есть int в их свойстве tag, вы должны добавить число ко всем кнопкам, включая те, которые не должны изменяться, как ваши кнопки Отмена и Ок. Что-то вроде нуля, чтобы исключить их из присвоения изображения.

Я уверен, что есть лучшие способы. Я давно не делал WinForms.

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