C#将不同的文件应用于同一个变量

本文关键字:应用于 同一个 变量 文件 | 更新日期: 2023-09-27 18:27:50

我正在尝试创建一系列按钮,每个按钮都播放一个声音。此声音是从OpenFileDialog函数中检索到的。然而,我遇到了一个声音被分配给所有按钮的问题。我知道为什么会发生这种情况,但我不确定如何解决这个问题。基本上,我开始为每个按钮分配相同的算法:

openFileDialog = new OpenFileDialog();
        if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            fileName = openFileDialog.FileName;
        }

和:

soundPlayer = new SoundPlayer(fileName);
        soundPlayer.Play();

不幸的是,这非常丑陋,所以我决定将每个算法放入一个方法中,并将这些方法调用到它们各自的按钮。像这样:

public void openDialog()
    {
        openFileDialog = new OpenFileDialog();
        if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            fileName = openFileDialog.FileName;
        }
    }
private void button27_Click(object sender, EventArgs e)
    {
        openDialog();
    }
public void playDialog()
    {
        soundPlayer = new SoundPlayer(fileName);
        soundPlayer.Play();
    }
private void button1_Click(object sender, EventArgs e)
    {
        playDialog();
    }

然而,由于openDialog()调用接收文件名的相同变量,因此调用openDialog()的每个按钮都使用相同的变量,因此播放相同的声音。

C#将不同的文件应用于同一个变量

您必须使fileName成为按钮的"一部分"。您可以通过以下任一方式完成:

  • 检索时使用按钮的Tag属性并强制转换为字符串
  • 创建一个名为SoundButton的Button子类,并添加字符串类型的FileName属性

做出选择。

例如,使用标签:

public void playDialog(string fileName)
{
    soundPlayer = new SoundPlayer(fileName);
    soundPlayer.Play();
}
private void button1_Click(object sender, EventArgs e)
{
    playDialog((sender as Button).Tag as string);
}

您可以制作一个声音列表,然后逐个循环播放:

创建列表:

List<string> soundsList = new List<string>();

添加到列表:

sounds.Add(openFileDialog.FileName);

播放声音:

foreach(string sound in soundsList)
{
  soundPlayer = new SoundPlayer(sound);
  soundPlayer.Play();
}

当然,我的答案是假设你保持先添加所有你想要的声音,然后全部播放的顺序。当然,您还需要添加验证,以检查用户是否为您提供了添加到列表中的正确声音。

编辑:阅读您的评论后,您还可以向按钮的Tag属性添加声音。然后,当你想播放特定按钮的声音时,你可以只播放按钮属性中的任何内容。

例如,您可以覆盖点击事件,如下所示:

private void button_Click(object sender, EventArgs e)
{
   string soundFile = (sender as Button).Tag as string;
   playDialog(soundFile);
}

这样,所有的声音都是按钮的"一部分"