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

请注意,我在另一个类中有我的 SoundPlayer,我正在使用 DelegateCommands 来引用我的 Button() 方法等。我也在使用 .wav 文件。另外,有没有更有效的方法来完成我想要完成的任务?如果您需要其他任何东西,请询问。

谢谢!

4

1 回答 1

0

您的 UI 冻结,因为这是您在调用时所要求的_sound.PlaySync()

查看SoundPlayer 文档,您可以使用以下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()调用的原因。

于 2017-05-27T18:27:02.167 回答