我偶然发现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
工作吗?
答案 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();
}
我不再遇到这个问题,并且只在适当的时候点击终结器(即关闭窗口)。
请注意,子类不是必需的,仅用于终结器插图