C# MediaElement是否仅在嵌入XAML代码时播放?

C# MediaElement是否仅在嵌入XAML代码时播放?,c#,wpf,xaml,audio,mediaelement,C#,Wpf,Xaml,Audio,Mediaelement,我有一个声音播放器类,根本没有任何视觉效果,我正在尝试使用MediaElement来播放我的声音。在所有的测试项目中,MediaElement嵌入到XAML代码中,它工作得很好。但是,在我的纯代码版本中,is根本不播放任何内容,即使文件已完全加载(我可以在调试器中看到)。我正在做以下工作: public class MySoundPlayer { private MediaElement player = new MediaElement(); public MySoundPl

我有一个声音播放器类,根本没有任何视觉效果,我正在尝试使用
MediaElement
来播放我的声音。在所有的测试项目中,
MediaElement
嵌入到XAML代码中,它工作得很好。但是,在我的纯代码版本中,is根本不播放任何内容,即使文件已完全加载(我可以在调试器中看到)。我正在做以下工作:

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;
    }
}

我仔细检查了文件是否存在,它确实存在(甚至加载正确),并且我的声音已打开。:-)另外,当我通过
SoundPlayer
更改
MediaElement
时,它工作得非常好。我能找到的唯一区别是我没有将它嵌入到XAML代码中。这是一项要求吗?

为了工作,MediaElement必须是应用程序逻辑树的一部分,因此必须添加到应用程序中的某个容器(网格、StackPanel)中

您可以通过XAML添加MediaElement(正如您之前所做的那样),也可以在运行时通过

LayoutRoot.Children.Add(player);
您应该使用类,而不是使用MediaElement。这将在不将其附加到XAML的情况下工作(至少对我来说)

MediaPlayer player = new MediaPlayer();
player.Open(new Uri(fileName, UriKind.RelativeOrAbsolute));
player.Play();

但是我的类实际上就是这个(有问题的代码),所以它没有布局,因此没有
LayoutRoot
。我是否必须扩展
UserControl
才能使用
MediaElement
?啊哈,我不知道这个
MediaPlayer
的存在。这就是当您不熟悉API时会发生的情况。这工作顺利!您还可以使用MediaPlayer将视频绘制到视频上,因此,如果您90%的时间都有音频,仅在这10%的时间里,您不需要在可视化树中使用MediaElement。尝试在Windows Store Universal Project for 8.1中实例化MediaPlayer时,我发现:
类型“Windows.Media.Playback.MediaPlayer”没有定义构造函数。
。啊哈,没关系。看起来它应该通过
BackgroundMediaPlayer.Current
访问。我敢说,微软的各种平台风格最为复杂。