0

我正在创建应用程序,它使用按钮导航到另一个页面,并且我想在用户触摸按钮时保持声音。只有按钮时代码工作正常,但是当我使用按钮导航到另一个页面时,声音没有播放,但是当我按下 Windows phone 的返回按钮时播放。

public void playSound()
{
    MediaElement playSound1 = new MediaElement();
    playSound1.Source = new Uri("/Sound/Lionsound.mp3", UriKind.Relative);
    playSound1.Play();
}

void btnClassicPuzzle_Click(object sender, System.Windows.RoutedEventArgs e)
{
    playSound();
    NavigationService.Navigate(new Uri("/Menu/SelectPack.xaml", UriKind.Relative));
}
4

2 回答 2

0

您正在调用一个函数来播放按钮单击的声音并立即执行页面导航。编译器如何处理它之后playSound1.Play(),声音被启动并立即调用NavigationService. 页面被更改,当前页面中的所有对象都被销毁,因此声音停止。您需要做的是导航到事件的下一页,MediaEnded以便它可以在导航之前播放完整的声音

<MediaElement MediaEnded="eventhandler" ../>

引用

您也可以MediaPlayer使用MediaPlayer.State;检查状态 导航前

于 2013-10-04T11:12:09.680 回答
0

我认为您可以在您的应用程序中使用全局 MediaElement。

要使用全局的全局 MediaElement,您可以按照以下步骤操作。

首先在你的 app.xaml 添加一个 ControlTemplate

         <ControlTemplate x:Key="AudioContentTemplate">
        <Grid x:Name="MediaElementContainer">

          <!-- The media element used to play sound -->
          <MediaElement Loaded="OnGlobalMediaLoaded"
                        Visibility="Collapsed" />

          <!-- Added for the normal content -->
          <Grid x:Name="ClientArea">
            <ContentPresenter />
          </Grid>
        </Grid>
      </ControlTemplate>

其次,在您的 app.xaml.cs 中,您必须声明 Globlal mediaElement 并添加播放和停止的方法。

   private MediaElement globalMediaElement = null;

    private void OnGlobalMediaLoaded(object sender, RoutedEventArgs e)
    {
        if (this.globalMediaElement == null)
            this.globalMediaElement = sender as MediaElement;

    }


    public   void playMedia(Uri source)
    {
        this.globalMediaElement.Source = source;
        this.globalMediaElement.Play();
    }

    public void stopMedia()
    {
        this.globalMediaElement.Stop();
    }

app.xaml.cs 末尾的第三个是初始化部分,在这里您使用资源中的模板在系统中注入了全局 Mediaelement:

   private void Application_Launching(object sender, LaunchingEventArgs e)
   {


      RootFrame.Style = (Style)Resources["AudioContentTemplate"];

    }

最后你可以在你的代码中调用它

  private void btnClassicPuzzle_Click(object sender, System.Windows.RoutedEventArgs e)
  {
    //play the globlal MediaElement 
     ((App)App.Current).playMedia(new Uri("/Sound/Lionsound.mp3", UriKind.Relative));

      NavigationService.Navigate(new Uri("/Menu/SelectPack.xaml", UriKind.Relative));
   }
于 2013-10-04T13:40:38.560 回答