MediaElement 是不是仅在嵌入 XAML 代码时播放?
Posted
技术标签:
【中文标题】MediaElement 是不是仅在嵌入 XAML 代码时播放?【英文标题】:Does a MediaElement only play when it is embedded in XAML code?MediaElement 是否仅在嵌入 XAML 代码时播放? 【发布时间】:2013-10-25 13:23:57 【问题描述】:我有一个完全没有任何视觉效果的声音播放器类,我正在尝试使用MediaElement
来播放我的声音。在所有测试项目中,MediaElement
嵌入在 XAML 代码中,它工作正常。但是,在我的纯代码版本中,即使文件已完美加载(我可以在调试器中看到),它也不会播放任何内容。我正在执行以下操作:
public class MySoundPlayer
private MediaElement player = new MediaElement();
public MySoundPlayer()
player.LoadedBehavior = MediaState.Manual;
player.UnloadedBehavior = MediaState.Stop;
player.Volume = 1.0;
player.MediaEnded += player_MediaEnded;
player.MediaOpened += playerr_MediaOpened;
player.MediaFailed += player_MediaFailed;
private void player_MediaEnded(object sender, EventArgs e)
player.Stop();
Debug.WriteLine("Stopped");
private void player_MediaOpened(object sender, EventArgs e)
Debug.WriteLine("Opened");
private void player_MediaFailed(object sender, ExceptionRoutedEventArgs e)
Debug.WriteLine("Failed");
public void PlayFile(string fileName, bool loop)
player.Source = new Uri(fileName, UriKind.RelativeOrAbsolute);
player.Play();
player.Volume = 1.0;
我仔细检查了文件是否存在,它确实存在(甚至正确加载),并且我的声音已打开。 :-) 另外,当我将MediaElement
更改为SoundPlayer
时,它工作得非常好。我能找到的唯一区别是我没有将它嵌入到 XAML 代码中。这是要求吗?
【问题讨论】:
【参考方案1】:为了工作,MediaElement 必须是应用程序逻辑树的一部分,因此必须添加到应用程序中的某个容器(Grid、StackPanel)中。
您可以通过 XAML 添加 MediaElement(就像您之前所做的那样),或者您可以在运行时通过以下方式添加它
LayoutRoot.Children.Add(player);
您应该使用 MediaPlayer 类,而不是使用 MediaElement。这将有效(至少对我而言),无需将其附加到 XAML。
MediaPlayer player = new MediaPlayer();
player.Open(new Uri(fileName, UriKind.RelativeOrAbsolute));
player.Play();
【讨论】:
但是我的课程实际上就是这个(有问题的代码),所以它没有布局,因此没有LayoutRoot
。我是否必须扩展UserControl
才能使用MediaElement
?
啊哈,我不知道这个MediaPlayer
的存在。当您不熟悉 API 时,就会发生这种情况。这工作顺利!
您还可以使用 MediaPlayer 将视频绘制到视觉上,因此如果您 90% 的时间都有音频,那么您在视觉树中不需要仅 10% 的 MediaElement时间。
尝试在 8.1 的 Windows 应用商店通用项目中实例化 MediaPlayer 给了我这个:The type 'Windows.Media.Playback.MediaPlayer' has no constructors defined
。
啊哈,没关系。看起来它应该通过BackgroundMediaPlayer.Current
访问。我敢说,MS 在其各种平台风格中有着最相互交织的参考。以上是关于MediaElement 是不是仅在嵌入 XAML 代码时播放?的主要内容,如果未能解决你的问题,请参考以下文章
ViewModel 中的 MediaElement.play()