Windows Phone 8.1媒体元素

时间:2015-09-16 16:50:10

标签: c# windows-phone-8.1 windows-phone

我目前有2个按钮,奥迪TT RS和奥迪R8 当用户点击按钮TT RS时,它会播放一个mp3,当用户点击按钮R8时,它会打开一个不同的mp3文件。

但这有效...如果用户点击其中一个,然后点击另一个。这两个mp3文件都会打开,听起来很糟糕。

这些是我的职能:

async void Audir8_Click(object sender, RoutedEventArgs e)
        {
            MediaElement mediaplayer = new MediaElement();
            if (mediaplayer.CurrentState == MediaElementState.Playing)
            {
                mediaplayer.Stop();
            }
            // get folder app is installed to
            var installFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;
            // get folders mp3 files are installed to.
            var resourcesFolder = await installFolder.GetFolderAsync("Resources");
            var mp3FilesFolder = await resourcesFolder.GetFolderAsync("mp3Files");
            // open the mp3 file async
            var audioFile = await mp3FilesFolder.GetFileAsync("audir8.mp3");
            // var stream = await audioFile.OpenAsync(Windows.Storage.FileAccessMode.Read);
            using (var stream = await audioFile.OpenAsync(Windows.Storage.FileAccessMode.Read))
            {
                // play dat funky music
             //   MediaElement mediaplayer = new MediaElement();
                mediaplayer.SetSource(stream, audioFile.ContentType);

                var tcs = new TaskCompletionSource<bool>();
                mediaplayer.CurrentStateChanged += (_, __) =>
                {
                    if (mediaplayer.CurrentState != MediaElementState.Opening &&
                        mediaplayer.CurrentState != MediaElementState.Playing &&
                        mediaplayer.CurrentState != MediaElementState.Buffering)
                    // mediaplayer.CurrentState != MediaElementState.AcquiringLicense)
                    {
                        // Any other state should mean we're done playing
                        tcs.TrySetResult(true);
                    }
                };
                mediaplayer.Play();
                await tcs.Task; // Asynchronously wait for media to finish
            }
        }

和另一个,实际上是相同的..

 async void Audittrs_Click(object sender, RoutedEventArgs e)
        {
            MediaElement mediaplayer = new MediaElement();
            if (mediaplayer.CurrentState == MediaElementState.Playing)
            {
                mediaplayer.Stop();
            }
            // get folder app is installed to
            var installFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;
            // get folders mp3 files are installed to.
            var resourcesFolder = await installFolder.GetFolderAsync("Resources");
            var mp3FilesFolder = await resourcesFolder.GetFolderAsync("mp3Files");
            // open the mp3 file async
            var audioFile = await mp3FilesFolder.GetFileAsync("ttrs.mp3");
            // var stream = await audioFile.OpenAsync(Windows.Storage.FileAccessMode.Read);
            using (var stream = await audioFile.OpenAsync(Windows.Storage.FileAccessMode.Read))
            {
                // play dat funky music
              //  MediaElement mediaplayer = new MediaElement();
                mediaplayer.SetSource(stream, audioFile.ContentType);

                var tcs = new TaskCompletionSource<bool>();
                mediaplayer.CurrentStateChanged += (_, __) =>
                {
                    if (mediaplayer.CurrentState != MediaElementState.Opening &&
                        mediaplayer.CurrentState != MediaElementState.Playing &&
                        mediaplayer.CurrentState != MediaElementState.Buffering)
                    // mediaplayer.CurrentState != MediaElementState.AcquiringLicense)
                    {
                        // Any other state should mean we're done playing
                        tcs.TrySetResult(true);
                    }
                };
                mediaplayer.Play();
                await tcs.Task; // Asynchronously wait for media to finish
            }
        }

我认为这不应该发生,因为我正在使用

MediaElement mediaplayer = new MediaElement();
            if (mediaplayer.CurrentState == MediaElementState.Playing)
            {
                mediaplayer.Stop();
            }

1 个答案:

答案 0 :(得分:2)

设置媒体播放器本地变量时,您需要创建新的媒体播放器,而不是重新使用之前创建的媒体播放器。如果你重新使用之前创建的那个(比如在你的课程中将它作为一个字段加上属性),那么.Stop()调用应该停止前一个声音。

如果这样做,您必须更改每个..._Click方法的第一行以使用持久性MediaElement。

例如,在课堂上你可以这样做:

private MediaElement _mediaplayer;

public MediaElement Mediaplayer
{
  get{
    if( _mediaplayer == null )
    {
      _mediaplayer = new MediaElement();
    }
    return _mediaplayer;
  }
}

然后在您的..._Click方法中,换掉这个:

MediaElement mediaplayer = new MediaElement();

...为此:

MediaElement mediaplayer = this.Mediaplayer;

吸气者应该做其余的事情,确保你总是使用相同的MediaElement来播放你演奏的各种声音,这样你就可以根据自己的需要停止以前播放的声音。