2017-05-27 15 views
-1

私はこのボタンを私がちょっとしたいことをするようにしようとしてきました。私はそれが私がすることができたことです私はそれを押すと、音を再生したい。しかし、そのようなアプリケーションのようなボタンを押すたびに凍って、その音のすべての注意を与えるなど基本的に私の目標は、UIを停止せずにそれを再生することができるようにすることなく、ボタンの音を再生させることです移動する。また、ボタンを押したときにボタンの再生音を鳴らす方法があるかどうかを知りたいですが、もう一度押すと、現在の音が停止して再び再生され、ボタンをクリックしたクリック数 "X"を再生しないようにします。 。ボタンをクリックしてサウンドを再生し、UIを一時停止し、ボタンをスパムし続けると、連続して再生されますか?

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を使用しています私も.wavファイルを使用しています。また、達成しようとしている課題を達成するためのより効率的な方法がありますか?必要なものがあれば、尋ねてください。

ありがとうございます!

答えて

0

_sound.PlaySync()に電話すると、あなたのUIが凍結しています。

SoundPlayerdocumentationを見ると、あなたはPlay()方法使用できます

を新しいスレッドを使用して.wavファイルを再生し、それがロードされていない場合 最初の.wavファイルをロードします。

この方法を使用すると、コールをキューに入れないので、繰り返し再生するという問題も解決するはずです。

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

(注)上でそれを呼び出しているので、あなたの_sound.Stop()は、意味がないこと:

また、あなたがTry-Finally-Disposeとそこに何をしたかので、あなたのコードは次のようになり、usingを簡素化することができます新しいオブジェクトではなく、単に新しいオブジェクトにPlay()を呼び出すと、古いサウンドが停止してから新しいサウンドが再生されます。

また、ドキュメントにはPlay()がロードされていない場合にファイルがロードされると記載されているため、_sound.Load()コールをスキップしました。

+0

* "[...]だけSoundPlayerを処理すると停止されます。" *がtrueの場合、実際にPlayメソッドの呼び出しを使用ブロックに入れることはできませんか? (私はtry-finally-disposeの代わりにブロックを使用する方法を示したいと思っていることを知っていますが、答えの文脈では少し間違っているようです...) – elgonzo

+0

私はこれをテストして動作します。私はそれを処分すると音が止まると言うと間違っています。サウンドを止めるものが 'Play()'をもう一度呼び出すようです。ありがとう! –

+0

さて、ボタンを迷惑メールにすると、x回のクリックに対してまったく同じ音が再生されるという事実はどうですか? – Hypergyzed

関連する問題