代码:
pbs = new PictureBox[8];
for (int i = 0; i < pbs.Length; i++)
{
pbs[i] = new PictureBox();
pbs[i].MouseEnter += Form1_MouseEnter;
pbs[i].MouseLeave += Form1_MouseLeave;
pbs[i].Size = new Size(100, 100);
pbs[i].Margin = new Padding(0, 0, 0, 60);
pbs[i].Dock = DockStyle.Top;
pbs[i].SizeMode = PictureBoxSizeMode.StretchImage;
Panel p = i < 4 ? panel1 : panel2;
p.Controls.Add(pbs[i]);
pbs[i].BringToFront();
}
我做了:
pbs[i].MouseEnter +=
当我点击TAB时,它确实:Form1_MouseEnter 这不是我想要的。
我希望当我用鼠标移动到每个pictureBoxes区域时,它会做一些事情。 所有pictureBoxes的一个事件。 如果我移动pictureBox1做某事...... pictureBox2相同......
我该怎么办?我不想为每个pictureBox创建8个事件,而是为所有人创建一个事件。
答案 0 :(得分:1)
你只需要写
pbs[i].MouseEnter += globalMouseEnterEvent;
当然,您需要在代码中的某处globalMouseEnterEvent
public void globalMouseEnterEvent(object sender, System.EventArgs e)
{
....
}
但是,当您在多个控件之间共享事件时,需要另一条信息。您需要识别触发事件的控件。控件实例使用您可以强制转换为适当控件类型的sender
参数传递,但需要为控件提供唯一标识符。就像在构建控件时设置Tag或Name属性一样
for (int i = 0; i < pbs.Length; i++)
{
.....
pbs[i].Tag = "PB" + i.ToString()
...
}
所以在MouseEnter代码中你可以编写
public void globalMouseEnterEvent(object sender, System.EventArgs e)
{
PictureBox p = sender as PictureBox;
if(p.Tag.ToString() == "PB1")
.....
else if ......
}
答案 1 :(得分:0)
不要使用form1_event,复制它的代码并重命名
pbs[i].MouseEnter += yourEventName
够了
答案 2 :(得分:0)
您所做的是绝对正确的,您将处理程序附加到每个控件的事件中
转,这样同一个处理程序适用于每个PictureBox
。
我猜您的问题是VS创建的方法名为Form1_MouseEnter
。这完全无关紧要,决定方法将处理什么的是+=
运算符,而不是它的名称。只需尝试运行您的原始代码,它就能完成您想要的任务。
它似乎是C#编辑器中的一个错误,因为它应该将自动生成的处理程序命名为更合适的东西,但无论如何,您可以在之后重命名该方法以反映其真实含义。
答案 3 :(得分:-1)
我尝试将其他人的提示应用到您的代码中:
pbs = new PictureBox[8];
for (int i = 0; i < pbs.Length; i++)
{
pbs[i] = new PictureBox();
pbs[i].MouseEnter += Picturebox_MouseEnter;
pbs[i].MouseLeave += PictureBox_MouseLeave;
pbs[i].Name = string.Concat("PB", i); //Added to identify each picturebox
pbs[i].Size = new Size(100, 100);
pbs[i].Margin = new Padding(0, 0, 0, 60);
pbs[i].Dock = DockStyle.Top;
pbs[i].SizeMode = PictureBoxSizeMode.StretchImage;
Panel p = i < 4 ? panel1 : panel2;
p.Controls.Add(pbs[i]);
pbs[i].BringToFront();
}
处理程序:
private void Picturebox_MouseEnter(object sender, EventArgs e)
{
PictureBox pb = sender as PictureBox;
if (pb != null)
{
if (pb.Name == "PB2")
{
//Do PB2 specific task
}
//Your code when mouse enters one of the pictureboxes
//Use Name property to determine wich one, if needed
}
}
private void PictureBox_MouseLeave(object sender, EventArgs e)
{
//Your code when mouse leaves one of the pictureboxes
//Use Name property to determine wich one, if needed
}