0

WP7.5/Silverlight アプリ...

ページの読み込み時に、サウンド クリップを再生します (例: Hello! Today is a great day.)。

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
    seLoadInstance = seLoad.CreateInstance(); //I initialize this seLoad in Initialize method
    seLoadInstance.Play();
}

これで、ページに 3 ~ 4 個の要素が追加されました。ユーザーがそれらのいずれかをクリックすると、その要素のサウンド クリップが再生されます。

private void ElementClick_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    seElementInstance = seElement.CreateInstance();
    seElementInstance .Play();
}

私が欲しいのは 、ページが最初にロードされ、seLoadInstance が再生され、ユーザーが要素をクリックしている間、seElementInstance を再生したくないということです。

以下のようにseLoadInstanceの状態を確認して、seElementInstanceを再生しないようにすることができます

private void ElementClick_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
  if(seLoadTextInstance.State != SoundState.Playing)
  {     
        seElementInstance = seElement.CreateInstance();
        seElementInstance .Play(); 
   }
}

しかし、上記の問題は、クリック時にseLoadInstanceを再生できる別の要素があることです。

問題:再生中の seLoadInstance が初めてのものか、要素のクリック時かを区別する方法がわかりません。

考えられる解決策: 1 つの方法は、異なるインスタンスを使用して同じサウンドを再生することです。

ロード時にフラグを設定するなど、より良い方法を望んでいましたが、処理できるSoundInstanceの完了または停止の明示的なイベントが見つかりませんでした。

何か案は??

4

2 に答える 2

0

旗を使った方法を見つけることができました。初回のロード完了時にフラグを設定する代わりに、seLoadTextInstanceを再生する要素の1つからフラグを設定しました。

以下のようなもの:

private bool isElementLoadSoundPlaying = false; //I set this to true below in another handler

private void ElementClick_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
  //This if means LoadTextInstance is playing and it is the first time play
  if(seLoadTextInstance.State != SoundState.Playing && isElementLoadSoundPlaying == false )
  {     
     return;
  }
  seElementInstance = seElement.CreateInstance();
  seElementInstance .Play(); 
}

private void ElementLoadTextClick_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
  isElementLoadSoundPlaying = true;
  seLoadInstance = seLoad.CreateInstance();
  seLoadInstance.Play();
}
于 2012-06-21T17:16:24.733 に答える
0

今まで音を使ったことはありませんが、私が見たもの:

サウンドを再生したいとき、なぜ常に新しいインスタンスを作成するのですか? 「se」要素の両方のインスタンスを作成し、「play」を呼び出す前に誰かが実行されているかどうかを確認することはできませんか?

例えば:

private var seLoadInstance;
private var seElementInstance;

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
    seLoadInstance = seLoad.CreateInstance();
    seElementInstance = seElement.CreateInstance();

    seLoadInstance.Play(); // no need to check if something is playing... nothing will be loaded
}

private void ElementClick_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if(seLoadInstance.State != SoundState.Playing && seElementInstance.State != SoundState.Playing)
    {     
        seElementInstance .Play(); 
    }
}
于 2012-06-13T07:20:58.983 に答える