我有4个具有不同背景颜色的PictureBox。当我单击一个时,它更改为BorderStyle(因此看起来像是被选中的)。我想在单击另一个PictureBox时删除此BorderStyle(所以只有一个PictureBox具有此样式)。这是我的第一个Forms应用程序。
所有四个PictureBox的代码:
private void pictureBox1_Click(object sender, EventArgs e)
{
PictureBox p = (PictureBox)sender;
pen.Color = p.BackColor;
p.BorderStyle = BorderStyle.Fixed3D;
}
答案 0 :(得分:0)
只需直接调用所有图片框即可。您的所有四个图片框(假定命名为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;
}
答案 1 :(得分:0)
微型类,充当具有共同行为的控件集合的处理程序。
照原样,当单击集合中的一项时,它仅处理控件的边框样式,从而向Click
事件添加事件处理程序。它可以扩展以执行不同的任务。
它实现IDisposable
,以处理事件处理程序和添加到集合中的控件。
您可以使用类构造函数将项目添加到集合中,并传递IEnumerable(列表,数组)控件。可以对其进行修改以在需要时添加/删除控件。
在实例化类时添加控件; 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()
事件可能是一个很好的 place )
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();
}
}
}