为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
}
}
它只适用于我正在使用的图片框。
您需要调用一个方法,而不是引发事件。
创建一些方法并在这些方法上添加逻辑,然后在事件处理程序中,首先提取所需的信息,然后用参数调用合适的方法。
例如:
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();
看起来您已经有了一个图片框列表。因此,请尝试修改您的功能(例如缩放功能),使其适用于列表中的所有图片框,而不仅仅是一个图片框。
换句话说,不要试图为每个图片框调用事件处理程序,让每个事件处理程序调用一个函数,该函数会修改所有图片框。