为什么MediaPlayer在渲染发生之前启动时会无声地失败?

时间:2018-03-13 01:47:35

标签: c# .net wpf

我偶然发现MediaPlayer这种奇怪的行为,同时帮助有问题的人,我想看看是否有任何WPF专家可以解释它。我理解下面的例子不实用,但它最能说明这种行为。

假设我在MainWindow构造函数中抛出MediaPlayer并尝试启动它。

public MainWindow()
{
    InitializeComponent();
    MediaPlayer mp = new MediaPlayer();
    mp.Open(new Uri("Be Free.mp3", UriKind.Relative));
    mp.Play();
}

MediaPlayer将无声地失败,您将听不到任何音乐播放。现在这里的事情变得有趣了。假设我们在开始播放之前在那里抛出一个OpenFileDialog

public MainWindow()
{
        InitializeComponent();
        MediaPlayer mp = new MediaPlayer();
        mp.Open(new Uri("Be Free.mp3", UriKind.Relative));

        OpenFileDialog ofd = new OpenFileDialog();
        ofd.ShowDialog();

        mp.Play();
}

音乐将开始播放没有问题。您甚至不必选择文件,只需取消对话框就可以了。

供参考,我是Microsoft.Win32.OpenFileDialog。任何人都可以解释如何激活这个允许MediaPlayer工作吗?

1 个答案:

答案 0 :(得分:2)

我希望这与GC清理你的MediaPlayer实例有关,因为它是在构造函数中定义的。

作为测试,我构建了一个小例子,并将MediaPlayer子类化为终结器上的断点。在我的窗户出现后不久,终结者就被召唤了。

public class MyMediaPlayer : MediaPlayer
{

    ~MyMediaPlayer()
    {

    }
}

在我的窗口构造函数中使用类似的调用对此进行了测试。

public MainWindow()
{
    InitializeComponent();
    MyMediaPlayer _mp;
    _mp = new MyMediaPlayer();
    _mp.Open(new Uri("song.m4a", UriKind.Relative));
    _mp.Play();
}

现在,如果我将_mp作为实例级对象,例如。

MyMediaPlayer _mp;
public MainWindow()
{
    InitializeComponent();
    _mp = new MyMediaPlayer();
    _mp.Open(new Uri("song.m4a", UriKind.Relative));
    _mp.Play();
}

我不再遇到这个问题,并且只在适当的时候点击终结器(即关闭窗口)。

请注意,子类不是必需的,仅用于终结器插图