0

我正在制作 Windows 8 Metro 风格的应用程序。我希望能够同时运行不同的声音并管理它们。为了这个目标,我创建了 MediaPlayService,它应该包含允许我这样做的方法。

我发现了一个问题,在“_mediaElement.SetSource()”之后我无法更改音量。我打电话给 SetVolume 并没有发生任何事情。

Initialize(sound);
 SetVolume(100);
 Play();        --- this sequence works


Initialize(sound);
 Play();       
SetVolume(100); --- does not work (I can not change the volume during playback)

 public void SetVolume(int volume)
         {

          //_m ediaElement.Volume = Math.Round((double)((double)volume / 100), 2);
             double dvolume = Math.Round((double)((double)volume / 100), 2);

            _mediaElement.SetValue(MediaElement.VolumeProperty, dvolume);

        }

        string _mediaPath;

        public void Initialize(Sound sound)
         {
             _mediaElement = new MediaElement();
             _mediaPath = sound.FilePath;
             _mediaElement.AudioCategory = Windows.UI.Xaml.Media.AudioCategory.Communications;
             _mediaElement.IsLooping = true;
             _mediaElement.MediaFailed += _mediaElement_MediaFailed;
             _mediaElement.RealTimePlayback = true;
         }

        public async void Play()
         {

            var pack = Windows.ApplicationModel.Package.Current;

            var installedLoction = pack.InstalledLocation;
             var storageFile = await installedLoction.GetFileAsync(_mediaPath);

            if (storageFile != null)
             {
                 var stream = await storageFile.OpenAsync(Windows.Storage.FileAccessMode.Read);
                 _mediaElement.SetSource(stream, storageFile.ContentType);

                _mediaElement.Play();
             }
  }
4

1 回答 1

0

您的 MediaElement 不是您页面的 VisualTree 的一部分。因此,您必须处理那些无法正常工作的奇怪行为,例如设置音量或位置。

作为解决方案,您可以在 XAML 文件中创建 MediaElement 或将其从代码隐藏添加到 VisualTree(类似于 contentGrid.Children.Add( _mediaElement )。在后一种情况下,您可能必须在导航到另一个页面之前将其删除下次导航返回时,它可能不会播放。

于 2012-07-26T12:03:20.370 回答