Изменение свойства PictureBox при выборе другого PictureBox - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть 4 PictureBoxes с различными цветами фона. Когда я нажимаю на одну, она меняет свой BorderStyle (так что похоже, что он выбран). Я хочу удалить этот BorderStyle, когда я нажимаю на другой PictureBox (поэтому только один PictureBox имеет этот стиль). Это мое первое приложение Forms.

Код для всех четырех PictureBox:

private void pictureBox1_Click(object sender, EventArgs e)
        {
            PictureBox p = (PictureBox)sender;
            pen.Color = p.BackColor;
            p.BorderStyle = BorderStyle.Fixed3D;
        }

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Микрокласс, который действует как обработчик для коллекции элементов управления, которые имеют общее поведение.
Как таковой, он просто обрабатывает стиль границ элементов управления при щелчке по одному из элементов в коллекции, добавляя обработчик события к событию Click. Он может быть расширен для выполнения различных задач.

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

Вы можете добавлять элементы в коллекцию, используя конструктор класса, передавая IEnumerable (List, Array) элементов управления. Это может быть изменено, чтобы добавить / удалить элементы управления при необходимости.

Добавить элементы управления при создании экземпляра класса; событие Form.Load() является возможным выбором, но вы, конечно, можете создать его, когда захотите.

Вы можете добавить элементы управления, используя их тип:
(Добавьте все элементы управления PicureBox, принадлежащие текущей форме)

PictureBoxHandler pboxHandler = null;

private void Form1_Load(EventArgs e)
{
    pboxHandler = new PictureBoxHandler(this.Controls.OfType<PictureBox>());
}

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

pboxHandler = new PictureBoxHandler(new[] { pictureBox1, pictureBox2, pictureBox3, pictureBox4 });

Когда вы закончите с этим классом, избавьтесь от него, чтобы освободить выделенный ему ресурс:
(Form.FormClosed() событие может быть хорошим местом )

pboxHandler.Dispose();

Менеджер класс:

private class PictureBoxHandler : IDisposable
{
    public PictureBoxHandler(IEnumerable<PictureBox> items) {
        this.Items = new List<PictureBox>();
        this.Items.AddRange(items);
        this.Items.ForEach(i => i.Click += this.ItemSelected);
    }
    private List<PictureBox> Items { get; }
    private PictureBox Selected { get; set; } = null;

    protected internal void ItemSelected(object sender, EventArgs e)
    {
        (sender as PictureBox).BorderStyle = BorderStyle.Fixed3D;
        if (this.Selected != null) this.Selected.BorderStyle = BorderStyle.None;
        this.Selected = (PictureBox)sender;
    }
    public void Dispose() => this.Dispose(true);
    public void Dispose(bool disposing)
    {
        if (disposing) {
            if (this.Items is null) return;
            this.Items.ForEach(i => i.Click -= this.ItemSelected);
            for (int i = this.Items.Count - 1; i >= 0; i--) {
                this.Items[i].Dispose();
            }
            this.Items.Clear();
        }
    }
}
0 голосов
/ 11 апреля 2019

Просто позвоните прямо во все ваши коробки с картинками.Все четыре ваших графических блока (предположительно с именами pictureBox1, pictureBox2, pictureBox3 и pictureBox4) определены в вашем классе формы, поэтому они находятся в области видимости: то есть к ним можно напрямую получить доступ из любого места в одном и том же классе.

Вотпример того, как это может выглядеть:

private void pictureBox1_Click(object sender, EventArgs e)
{
    pictureBox1.BorderStyle = BorderStyle.None;
    pictureBox2.BorderStyle = BorderStyle.None;
    pictureBox3.BorderStyle = BorderStyle.None;
    pictureBox4.BorderStyle = BorderStyle.None;

    PictureBox p = (PictureBox)sender;
    pen.Color = p.BackColor;
    p.BorderStyle = BorderStyle.Fixed3D;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...