单击按钮然后播放声音,暂停用户界面,如果您发送垃圾邮件,按钮会继续播放? [复制]
Posted
技术标签:
【中文标题】单击按钮然后播放声音,暂停用户界面,如果您发送垃圾邮件,按钮会继续播放? [复制]【英文标题】:Clicking a button then playing a sound, pauses the UI and if you spam the button continuously plays? [duplicate] 【发布时间】:2017-05-27 16:53:29 【问题描述】:我一直试图让这个按钮做我想做的事。我希望它在按下它时播放声音,这就是我设法做到的。但是,就像每次按下按钮时应用程序都会冻结,将所有注意力都放在声音上,等等。所以基本上我的目标是让按钮播放声音,而无需让 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();
注意,我在另一个类中有我的 SoundPlayer,我正在使用 DelegateCommands 来引用我的 Button() 方法等。我也在使用 .wav 文件。另外,有没有更有效的方法来完成我想要完成的任务?如果您还需要什么,尽管问。
谢谢!
【问题讨论】:
【参考方案1】:您的 UI 冻结了,因为这是您致电 _sound.PlaySync()
时所要求的。
查看SoundPlayer
documentation,您可以使用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()
调用的原因。
【讨论】:
如果 "[...] 只是处理 SoundPlayer 就会让它停止。" 是真的,那么你不能真正将 Play 方法的调用放在一个像你一样使用块,或者? (我知道您想展示如何使用块而不是 try-finally-dispose,但在您的回答中,它似乎有点缺陷......) 我对此进行了测试并且它确实有效,所以当我说处置它会停止声音时我错了。似乎使声音停止的原因是再次调用Play()
。谢谢!
好的,如果我向按钮发送垃圾邮件,那么它会在 x 次点击中播放完全相同的声音?
我在这里进行了测试,但异步播放并没有做到这一点。这就是我所说的“只需在新对象上调用 Play() 将使旧声音停止,然后播放新声音。”以上是关于单击按钮然后播放声音,暂停用户界面,如果您发送垃圾邮件,按钮会继续播放? [复制]的主要内容,如果未能解决你的问题,请参考以下文章