给PictureBox添加鼠标点击事件处理程序

7

我有一个PictureBox控件,单击它后,另一个PictureBox会出现在特定位置。换句话说,它不是从工具箱添加的。

PictureBox picOneFaceUpA = new PictureBox();
        picOneFaceUpA.Location = new Point(42, 202);
        picOneFaceUpA.Width = 90;
        picOneFaceUpA.Height = 120;
        picOneFaceUpA.Image = Image.FromFile("../../Resources/" + picFaceUpToBeMoved[0] + ".png");
        Controls.Add(picOneFaceUpA);
        picOneFaceUpA.BringToFront();

我该如何为这个控件添加一个鼠标单击事件处理程序?
谢谢
4个回答

12

只需使用+=运算符添加事件处理程序:

picOneFaceUpA.MouseClick += new MouseEventHandler(your_event_handler);

或者:

picOneFaceUpA.MouseClick += new MouseEventHandler((o, a) => code here);

我发现我的PictureBox没有MouseClick事件? - Allan Ruin
@AllanRuin - 它确实有,就像所有(或大多数)WinForms控件一样:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.picturebox_events(v=vs.85).aspx - Jon B
我找到了!之前我在类的非构造部分中输入了picturebox实例,所以MouseClick无法使用。 - Allan Ruin
如果我使用的是一个图像对象而不是一个PictureBox,会怎样呢? - Ashton
@Ashton 一个图像对象不是UI控件;它只是图像数据。你仍然需要将其放入某种控件中才能在UI上显示它。 - Nyerguds

2

在WinForms中订阅事件的最佳方法 - 在设计器中选择您的控件,转到属性窗口并选择事件选项卡。然后选择您想要的任何事件(单击,鼠标单击等),并双击事件名称右侧的空白处。事件处理程序将被生成并订阅事件。


如果您想手动订阅事件,则需要将事件处理程序添加到事件中。
picOneFaceUpA.MouseClick += PicOneFaceUpA_MouseClick;

在编写+=后按下Tab将生成处理程序。或者您可以手动编写:
void PicOneFaceUpA_MouseClick(object sender, MouseEventArgs e)
{
   // handle click event
   if (e.Button == MouseButtons.Left)
       MessageBox.Show("Left button clicked");
}

顺便提一下,如果您不需要有关单击事件的其他信息(例如,单击了哪个按钮),则请改用Click事件。它默认处理左键单击:

picOneFaceUpA.Click += PicOneFaceUpA_Click;

并处理程序:

void PicOneFaceUpA_Click(object sender, EventArgs e)
{
   // show another picture box
}

@carny666 已更改为 MouseClick,但实际上如果 OP 只对 picturebox 控件感兴趣,并在单击它时.. 那么 Click 应该就足够了。 - Sergey Berezovskiy
小注释...你需要按两次Tab键才能生成函数。第一个Tab键只会生成文本“PicOneFaceUpA_Click”。 - NutellaAddict

1

如果你输入picOneFaceUpA.Click +=然后按Tab键,它会自动完成并实现事件处理程序:

    private void button2_Click(object sender, EventArgs e)
    {
        PictureBox picOneFaceUpA= new PictureBox();
        picOneFaceUpA.Click += new EventHandler(picOneFaceUpA_Click);
    }

    void picOneFaceUpA_Click(object sender, EventArgs e)
    {
        throw new NotImplementedException();
    }

1

看起来你知道如何添加动态控件,那么你应该只需要这样做

this.picOneFaceUpA.MouseClick += new MouseEventHandler(yourMethodName); //hook

并且移除一个事件

this.picOneFaceUpA.MouseClick -= yourMethodName;     //unhook

该方法应该声明为以下内容:

private void yourMethodName(object sender, MouseEventArgs e)
{
    //your code here
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接