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 代码时播放?的主要内容,如果未能解决你的问题,请参考以下文章

MediaElement 的两种模式

ViewModel 中的 MediaElement.play()

恢复应用程序后 MediaElement 不播放

背水一战 Windows 10 (59) - 控件(媒体类): Image, MediaElement

如何确定 MediaElement 是不是正在播放?

MediaElement:找出文件是不是包含支持的格式