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()
的每个按钮都使用相同的变量,因此播放相同的声音。
您必须使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);
}
这样,所有的声音都是按钮的"一部分"