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

时间:2013-10-25 13:23:58

标签: c# wpf xaml audio mediaelement

我有一个完全没有任何视觉效果的声音播放器类,我正在尝试使用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 个答案:

答案 0 :(得分:7)

为了工作,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();