2

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

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

4

3 回答 3

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块中以确保发生这种情况。

于 2013-03-11T14:49:24.007 回答
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();
        }
}
于 2013-03-11T14:50:03.553 回答
1

我建议采用以下方法:

  1. 将 声明SoundPLayerForm.
  2. Browse按钮的处理程序中获取文件名,创建一个流并SoundPlayer用它初始化你。
  3. Play按钮的处理程序中Play()调用SoundPlayer.
于 2013-03-11T14:53:15.527 回答