有什么办法可以让一个命令适用于所有按钮

时间:2015-10-22 22:03:39

标签: c# button audio

我正在制作一个工具,我想出了如何为按钮做声音效果。有没有什么办法可以让一个命令适用于所有按钮,而不必在每个按钮编码之前输入我为音效制作的定义。我知道在每个按钮的编码之前放置命令会起作用,但有没有办法做到这一点?感谢

1 个答案:

答案 0 :(得分:0)

假设您正在谈论WinForms或WebForms,您可以这样做:

private void Form1_Load(object sender, EventArgs e)
{
    foreach (Button b in Controls.OfType<Button>())
    {
        b.Click += MakeSoundEffect;
    }
}

private void MakeSoundEffect(object sender, EventArgs e)
{
    // Do something
}

这会占用您表单上的所有按钮,点击后会执行MakeSoundEffect。您可以使用sender对象来确定推送哪个按钮。

如果你的MakeSoundEffect()方法足够简单,你可能想使用lambda创建一个闭包,如下所示:

private void Form1_Load(object sender, EventArgs e)
{
    foreach (Button b in Controls.OfType<Button>())
    {
        b.Click += (btnSender, btnEvent) =>
        {
            // Do Something
        };
    }
}

此外,如果您不想要所有按钮,但可能只是名称以btnSoundEffect开头的按钮,则可以将foreach循环更改为以下内容:

foreach (Button b in Controls.OfType<Button>().Where(z => z.Name.StartsWith("btnSoundEffect")))

可能更好的方法是,如果只需要特定的按钮,就可以在表单上创建一个组并将所有按钮放在该组中,然后只需将for循环更改为:

foreach (Button b in grpButtons.Controls.OfType<Button>())
{
    // Do Something
}