2017-05-27 39 views
-1

我一直在試圖讓這個按鈕來做一些我想要的東西。當我按下它時,我希望它能發出聲音,這正是我設法做到的。但是,每當你按下按鈕時,它就像應用程序凍結一樣,給予聲音所有的注意力,等等。所以基本上我的目標是讓按鈕播放聲音,而不必讓UI停止並讓它播放,之前繼續。我也想知道按下時是否有按鈕播放聲音的方法,但是當再次按下時,當前聲音停止並再次播放,以防止播放點擊按鈕的「X」點擊量等。點擊一個按鈕,然後播放聲音,暫停用戶界面,如果你垃圾按鈕連續播放?

這裏是我的代碼:

public static void ButtonSound() 
    { 
     SoundPlayer _sound = new SoundPlayer(); 
     try 
     { 
      _sound.Stop(); 
      _sound.SoundLocation = path + "ButtonTap.wav"; 
      _sound.Load(); 
      _sound.PlaySync(); 
     } 
     catch 
     { 

     } 
     finally 
     { 
      _sound.Dispose(); 
     } 
    } 

和按鈕的代碼:

private void Button() 
    { 
     SoundPlayers.ButtonSound(); 
    } 

注意,我有我的另一個類聲音播放,和我使用DelegateCommands引用我的按鈕()方法等我也使用.wav文件。另外,是否有更高效的方法來實現我正在努力完成的任務?如果你需要別的東西,就問問。

謝謝!

回答

0

您的用戶界面已經凍結,因爲這是您撥打_sound.PlaySync()時要求的內容。

望着SoundPlayerdocumentation,您可以使用Play()方法:

播放使用一個新的線程.wav文件,如果它沒有被加載加載.wav文件第一 。

使用此方法還應解決反覆播放聲音的問題,因爲您不再排隊呼叫。

而且,你Try-Finally-Dispose做了什麼,也可以用using被簡化,因此您的代碼應該是這樣的:

public static void ButtonSound() 
{ 
    using (var _sound = new SoundPlayer()) 
    { 
     _sound.SoundLocation = path + "ButtonTap.wav"; 
     _sound.Play(); 
    } 
} 

請注意,您_sound.Stop()沒有意義的,因爲你是在調用它新對象,但只需在新對象上調用Play()將使舊聲音停止,然後播放新聲音。

此外,文檔說Play()加載該文件,如果它尚未加載,這就是爲什麼我跳過_sound.Load()調用。

+0

如果*「[...]只是處置SoundPlayer將使其停止。」*是真的,那麼你真的不能像你所做的那樣將Play方法的調用放在使用塊中,或者? (我知道你想展示如何利用塊來代替try-finally-dispose,但在你的答案中,它似乎有點缺陷......) – elgonzo

+0

我測試了這個,它確實有效,所以我當我說處置它停止聲音時,我錯了。看起來停止的聲音是再次調用'Play()'。謝謝! –

+0

好的,如果我要發送垃圾郵件按鈕,它會播放x次點擊的完全相同的聲音? – Hypergyzed