我正在尝试整理一个表单应用程序来浏览和播放WAV文件。目前,它有两个按钮 - 一个用于浏览和选择WAV,另一个用于播放。我已经实现了浏览按钮,它工作正常。我通过在按钮内播放WAV声音来检查它,如您所见:
private void Browse_Click(object sender, EventArgs e) {
OpenFileDialog tarik = new OpenFileDialog();
tarik.Title = "Browse...";
tarik.InitialDirectory = @"Desktop";
tarik.Filter = "Wav files (*.wav)|*.wav";
tarik.RestoreDirectory = true;
if (tarik.ShowDialog() == DialogResult.OK) {
textBox1.Text = tarik.FileName;
Stream tarik2 = tarik.OpenFile();
SoundPlayer snd = new SoundPlayer(tarik2);
snd.Play();
}
}
我测试了代码并且它正常工作,但是当我尝试从另一个按钮调用'tarik'时:
private void Play_Click(object sender, EventArgs e) {}
如上所示,它表示我不允许这样做。
答案 0 :(得分:3)
您在浏览器处理程序中创建的变量是局部变量(因为它们应该是),这意味着一旦方法结束,就无法访问它们(因为它们不存在)。
您需要创建一个实例字段,该字段在对象的整个生命周期内存在,以允许其他方法访问它:
//new instance field.
private string tarikFileName;
private void Browse_Click(object sender, EventArgs e)
{
OpenFileDialog tarik = new OpenFileDialog();
tarik.Title = "Browse...";
tarik.InitialDirectory = @"Desktop";
tarik.Filter = "Wav files (*.wav)|*.wav";
tarik.RestoreDirectory = true;
if (tarik.ShowDialog() == DialogResult.OK) {
//store value in instance field
tarikFileName = tarik.FileName;
textBox1.Text = tarik.FileName;
Stream tarik2 = tarik.OpenFile();
using(SoundPlayer snd = new SoundPlayer(tarik2))
snd.Play();
}
}
private void Play_Click(object sender, EventArgs e)
{
if(tarikFileName != null)
{
Stream stream = File.OpenRead(tarikFileName);
using(SoundPlayer snd = new SoundPlayer(stream))
snd.Play();
}
}
另请注意,SoundPlayer
应该在您完成后处理,因此我将其包装在using
块中以确保发生这种情况。
答案 1 :(得分:1)
为了在两种方法之间共享数据,您需要一些地方来存储引用。在您的情况下,我建议从textBox1.Text
中提取文件名。这样您就不必担心在多个地方管理(打开/关闭)流。
private void Browse_Click(object sender, EventArgs e)
{
OpenFileDialog tarik = new OpenFileDialog();
tarik.Title = "Browse...";
tarik.InitialDirectory = @"Desktop";
tarik.Filter = "Wav files (*.wav)|*.wav";
tarik.RestoreDirectory = true;
if (tarik.ShowDialog() == DialogResult.OK) {
textBox1.Text = tarik.FileName;
}
}
private void Play_Click(object sender, EventArgs e)
{
using(Stream tarik2 = File.Open(textBox1.Text, FileMode.Open))
{
SoundPlayer snd = new SoundPlayer(tarik2);
snd.Play();
}
}
答案 2 :(得分:1)
我建议采用以下方法:
SoundPLayer
声明为Form
。Browse
按钮的处理程序中获取文件名,创建一个流并使用它初始化SoundPlayer
。Play
按钮的处理程序中调用Play()
的{{1}}方法。