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

Fire an event simultaneously for multiple dynamic controls in c# winform

我在 FlowLayoutPanel 中动态添加了 NPictureBoxes。 当我创建它们时,我将事件处理程序附加到它们。例如:

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/3rd/.../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
    }
}

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

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

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

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

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

例如:

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();