为c#winform中的多个动态控件同时激发一个事件

本文关键字:事件 一个 c#winform 动态控件 | 更新日期: 2023-09-27 18:26:54

我在FlowLayoutPanel中有N个动态添加的PictureBoxes。当我创建它们时,我会将事件处理程序附加到它们上。例如:

for(int i=0;i<x;i++) {    
    var pe= new PictureBox();
    pe.MouseUp+=mouseup;
    pe.MouseDown+=mouseDown;
    pe.MouseMove+=mouseMove;
    pe.Paint+=paint;
}

我的目标是,每当我使用任何一个图片框时,都会为所有图片框启动这些事件。例如,如果我移动一个picturebox(1st/2nd/3d/…/n),所有其他框都将自动移动,如果我缩放任何框,其他框都会自动缩放。当我与任何人合作时,如何同时为所有图片框启动事件。

例如,如果我尝试:

void mouseWheel(object sender, MouseEventArgs e) {
    var control=(PictureBox)sender;
    var parent=control.parent;
    var pictureBoxes=parent.ofType<PictureBox>();
    foreach(pb in pictureBoxes) {
                //do something
    }
}

它只适用于我正在使用的图片框。

为c#winform中的多个动态控件同时激发一个事件

您需要调用一个方法,而不是引发事件。

创建一些方法并在这些方法上添加逻辑,然后在事件处理程序中,首先提取所需的信息,然后用参数调用合适的方法。

例如:

void pictureBox_MouseWheel(object sender, MouseEventArgs e)
{
    //Some parameter that you extract from eventArgs or somewhere else
    int zoomFactor = e.Delta;
    //Call the method on your picture boxes
    foreach (var p in pictureBoxes)
    {
        Zoom(p, zoomFactor);
    }
}
//The method that contains logic of zoom on a picture box
public void Zoom(PictureBox p, int zoomFactor)
{
    //It is just an example, not a real logic
    p.SizeMode = PictureBoxSizeMode.Zoom;
    p.Width += (zoomFactor * 10);
    p.Height += (zoomFactor * 10);
}

我想你在创建图片框时已经将它们添加到List<PictureBox>中了。

此外,如果您已将图片框添加到控件的Controls集合中,例如theControl,则稍后可以通过以下方式找到它们:

var pictureBoxes = theControl.Controls.OfType<PictureBox>().ToList();

看起来您已经有了一个图片框列表。因此,请尝试修改您的功能(例如缩放功能),使其适用于列表中的所有图片框,而不仅仅是一个图片框。

换句话说,不要试图为每个图片框调用事件处理程序,让每个事件处理程序调用一个函数,该函数会修改所有图片框。