C# 无法引发事件

C# 无法引发事件,c#,wpf,C#,Wpf,我试图获得用户选择的音乐文件列表的自然持续时间 MediaElement getDetails; //class variable private void AddMusictoList(List<music> pMusic) { getDetails = new MediaElement(); getDetails.MediaOpened += getDetails_MediaOpened; get

我试图获得用户选择的音乐文件列表的自然持续时间

    MediaElement getDetails;    //class variable
    private void AddMusictoList(List<music> pMusic)
    {
        getDetails = new MediaElement();  

        getDetails.MediaOpened += getDetails_MediaOpened;
        getDetails.MediaFailed += getDetails_MediaFailed;
        getDetails.LoadedBehavior = MediaState.Manual;
        Uri path;
        list = new music();
        foreach (music iMusic in pMusic)
        {
            path = new Uri(iMusic.path);
            list = iMusic; 
            getDetails.Source = path;
            getDetails.Play();
        }
    }
    //the function below is not called.why?
    private void getDetails_MediaOpened(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Hey");
        list.duration = getDetails.NaturalDuration.TimeSpan.ToString(@"hh\:mm\:ss");
        MessageBox.Show(list.duration);
        this.musicList.Items.Add(list);
    }


void getDetails_MediaFailed(object sender, ExceptionRoutedEventArgs e)
    {
        MessageBox.Show("Failed");
    }
MediaElement获取详细信息//类变量
私有void AddMusictoList(列表pMusic)
{
getDetails=newMediaElement();
getDetails.mediaopend+=getDetails\u mediaopend;
getDetails.MediaFailed+=getDetails\u MediaFailed;
getDetails.LoadedBehavior=MediaState.Manual;
Uri路径;
列表=新音乐();
foreach(音乐中的音乐)
{
路径=新Uri(iMusic.path);
列表=音乐;
getDetails.Source=path;
getDetails.Play();
}
}
//没有调用下面的函数。为什么?
私有void getDetails_mediaopend(对象发送方,路由目标)
{
MessageBox.Show(“嘿”);
list.duration=getDetails.NaturalDuration.TimeSpan.ToString(@“hh\:mm\:ss”);
MessageBox.Show(list.duration);
this.musicList.Items.Add(列表);
}
void getDetails_MediaFailed(对象发送方,例外路由EventTarget e)
{
MessageBox.Show(“失败”);
}

未启动媒体打开功能。我已经调试了代码。getDetails.Source之后的自然持续时间保持不变(即设置为自动),并且没有时间跨度。为什么?

媒体元素
没有播放媒体,因为它没有添加到用户界面中。您的
MediaElement
在代码隐藏中创建,并存储在私有字段中;我假设它从未对用户可见

我在中找不到任何说明这一点的内容,但我确实发现媒体控件在我将其添加到
网格时确实开始播放媒体

但是,将
MediaElement
添加到UI时,将调用
打开的
事件处理程序,但仅针对最后一个媒体文件。这是因为加载媒体的过程发生在后台,同时代码继续运行。因此,对于除最后一个文件以外的所有媒体文件,在加载完一个文件之前,您会请求它加载下一个文件,从而中断
MediaElement

为了提高性能,一次只能加载一个媒体文件,当每个媒体文件加载完毕后,开始加载下一个媒体文件:

    // New private field.  This enumerator stores our current position
    // iterating through the media files.
    private IEnumerator<music> files;

    private void AddMusictoList(List<music> pMusic)
    {
        this.files = pMusic.GetEnumerator();
        AddNextMusicFileIfExists();
    }

    // Starts loading the next file, if there is a next one.
    // If there isn't a next one, stops the media element.
    private void AddNextMusicFileIfExists()
    {
        if (this.files.MoveNext())
        {
            music iMusic = this.files.Current;
            Uri path = new Uri(iMusic.path);
            getDetails.Source = path;
            getDetails.Play();
        }
        else
        {
            getDetails.Stop();
        }
    }

    // I've replaced the MessageBoxes in this method with a call to
    // Debug.WriteLine, to prevent you getting spammed with lots of
    // message boxes.
    private void getDetails_MediaOpened(object sender, RoutedEventArgs e)
    {
        this.files.Current.duration = getDetails.NaturalDuration.TimeSpan.ToString(@"hh\:mm\:ss");
        System.Diagnostics.Debug.WriteLine(this.files.Current.duration);
        this.musicList.Items.Add(this.files.Current);
        AddNextMusicFileIfExists();
    }

这里我只是将输出写入
Debug.WriteLine
。在前面提到的同一组35个MP3文件上运行此操作需要0.2秒,这比使用
MediaElement

要快得多。我已经编辑了您的标题。请参阅“”,其中一致意见是“不,他们不应该”。好吧……我下次会注意:)尝试为
MediaElement
MediaFailed
事件添加事件处理程序,看看是否调用该事件。@LukeWoodward:我已更新了问题。我添加了mediaFailed,但没有发生任何事情…没有持续时间,事件仍然没有引发(mediaFailed和MediaOpen),谢谢您的回复。一两天后我会试试这个。实际上有两个MediaElement(一个当前正在使用(播放),另一个逐个加载文件(如果用户选择了多个文件),并获取音乐文件的详细信息并存储在列表中)。问题是,我已经调试了代码,即使列表中有一个元素,它也不会调用函数,我用xaml中声明的两个mediaElements尝试了这一点,比如第一个(第一个运行良好)@SaadAbdullah:另一个选项是
MediaPlayer
类(请参阅我上面编辑的答案)。这不是一个控件,无法添加到UI中,并且似乎可以工作。然而,它仍然具有与
MediaElement
相同的糟糕性能。如果您愿意,可以尝试一下,但我仍然推荐TagLib。感谢Luke的回复,我已经尝试了MediaPlayer,我发现mediaElement更好。你能解释一下TagLib吗?@SaadAbdullah:我在回答中增加了一节关于TagLib的内容。
    foreach (music iMusic in pMusic)
    {
        using (TagLib.File file = TagLib.File.Create(iMusic.path))
        {
            System.Diagnostics.Debug.WriteLine(
                    file.Properties.Duration.ToString(@"hh\:mm\:ss"));
        }
    }