选择另一个PictureBox时更改PictureBox的属性

时间:2019-04-11 15:57:18

标签: c# winforms

我有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;
        }

2 个答案:

答案 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();
        }
    }
}