2013-03-11 63 views
2

我想放在一起的表單應用程序來瀏覽和播放WAV文件。目前,它有兩個按鈕 - 一個用於瀏覽和選擇WAV,另一個用於播放。我已經實現了瀏覽按鈕,它工作正常。我檢查了它打在按鈕中的WAV聲音,你可以看到:讀取文件,然後從另一個按鈕使用它c#

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(); 
    } 
} 

我測試的代碼,它是工作,但是當我試圖從另一個調用按鈕「拉茶」:

private void Play_Click(object sender, EventArgs e) {} 

如上所示,它說我不允許這樣做。

+0

你想做什麼... – 2013-03-11 14:46:08

+0

@MikeyMouse是什麼讓你覺得這是ASP,而不是說WinForm或WPF應用程序? – Servy 2013-03-11 14:52:05

+0

@Servy糟糕,你是對的。我的錯。盯着Asp.net代碼太久了。對不起, – 2013-03-11 14:57:38

回答

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

爲了在兩種方法之間共享數據,您需要一些地方來存儲引用。在你的情況下,我會建議從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(); 
     } 
} 
+0

如果用戶修改該文本框,會發生什麼情況?你不應該在UI中存儲這樣的數據。 UI應該僅用於顯示數據或從用戶獲取輸入。 – Servy 2013-03-11 14:51:03

+0

@Servy我不同意。我經常用文本框輸入和一個「瀏覽」圖標來查看這個模式,在文本框中輸入一個文件名。如果需要,用戶可以選擇調整路徑。 – 2013-03-11 15:33:17

1

我建議以下方法:

  1. 聲明SoundPLayer爲您Form的變量。
  2. Browse按鈕的處理程序中獲取文件名,創建一個流並用它初始化您的SoundPlayer
  3. Play按鈕的處理程序中調用SoundPlayerPlay()方法。
+1

'SoundPlayer'是一次性的,所以如果你這樣做的話,確保它被丟棄,你將最終耗費資源的時間遠遠超過需要。 – Servy 2013-03-11 15:00:59

相關問題