1

编码:

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 这不是我想要的。

我希望当我用鼠标在每个图片框区域上移动时,它会做一些事情。所有图片框的一个事件。如果我移到pictureBox1 上做点什么...pictureBox2 一样...

我该怎么做 ?我不想为每个图片框创建 8 个事件,而是为所有人创建一个输入事件。

4

4 回答 4

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 ......
}
于 2013-10-12T13:47:13.167 回答
0

您所做的是绝对正确的,您将处理程序依次附加到每个控件的事件,以便相同的处理程序适用于每个PictureBox.

我猜你的问题是 VS 创建的方法名为Form1_MouseEnter. 这是完全无关的,决定一个方法处理什么的是+=操作符,而不是它的名字。只需尝试运行您的原始代码,它就会执行您想要的操作。

虽然这似乎是 C# 编辑器中的一个错误,因为它应该将自动生成的处理程序命名为更合适的名称,但无论如何,您可以在之后重命名该方法以反映其真正含义。

于 2013-10-12T13:51:48.557 回答
0

不要使用 form1_event ,复制它的代码并重命名它

pbs[i].MouseEnter += yourEventName

够了

于 2013-10-12T13:44:05.807 回答
-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
}
于 2013-10-12T15:09:28.117 回答