读取文件,然后从另一个按钮c#中使用它

时间:2013-03-11 14:42:36

标签: c# wav

我正在尝试整理一个表单应用程序来浏览和播放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) {}

如上所示,它表示我不允许这样做。

3 个答案:

答案 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)

我建议采用以下方法:

  1. SoundPLayer声明为Form
  2. 的变量
  3. Browse按钮的处理程序中获取文件名,创建一个流并使用它初始化SoundPlayer
  4. Play按钮的处理程序中调用Play()的{​​{1}}方法。