Микрокласс, который действует как обработчик для коллекции элементов управления, которые имеют общее поведение.
Как таковой, он просто обрабатывает стиль границ элементов управления при щелчке по одному из элементов в коллекции, добавляя обработчик события к событию 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();
}
}
}