c# - MediaElement 是否仅在嵌入到 XAML 代码中时才播放?

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

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

最佳答案

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

您可以通过 XAML 添加 MediaElement(就像您之前所做的那样),或者您可以在运行时通过

LayoutRoot.Children.Add(player);

您应该使用 MediaPlayer 而不是使用 MediaElement类(class)。这将在不将其附加到 XAML 的情况下工作(至少对我而言)。

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

关于c# - MediaElement 是否仅在嵌入到 XAML 代码中时才播放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19591131/

相关文章:

C# vb : System. Func占用多少内存?

c# - 是否可以使用 Windows API 代码包设置/编辑文件扩展属性?

WPF 弹出窗口和 WindowsFormsHost 问题

c# - IO.Stream 到 WPF 中的图像

c# - 在 WPF 应用程序中应用 MVVM 模式

c# - 如何使用刷新 token 更新访问 token ?

c# - 如何在 .NET 中将此字符串格式化为 DateTime

wpf - 可重用的 ItemsControl(例如 ListViews)+ MVVM

c# - ExpanderView 在页面导航后展开

wpf - 单击组名称时 CollectionViewSource 取消选择 selectedItem