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

时间:2014-10-26 20:53:54

标签: c# audio

我正在尝试创建一系列按钮,每个按钮都会发出声音。从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()的每个按钮都使用相同的变量,因此播放相同的声音。

2 个答案:

答案 0 :(得分:1)

您必须使文件名成为Button的“部分”。您可以通过以下任一方式完成:

  • 使用按钮的Tag属性并在检索时强制转换为字符串
  • 创建一个名为SoundButton的Button的子类,并添加类型为string
  • 的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);
}

答案 1 :(得分:0)

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

创建列表:

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

添加到列表中:

sounds.Add(openFileDialog.FileName);

播放声音:

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

我的答案当然是假设你先保留一个首先添加所需声音然后全部播放的顺序。您当然还需要添加验证以检查用户是否已将正确的声音添加到列表中。

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

例如,您可以像这样覆盖Click事件:

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

这样所有声音都是&#34;部分&#34;按钮