2017-05-27 40 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