none
MediaElement不能触发任何事件 RRS feed

  • 问题

  • MediaElement player;

    player = new MediaElement();

    player.AudioCategory = AudioCategory.BackgroundCapableMedia;

    player.AutoPlay = true;
    player.CurrentStateChanged += player_CurrentStateChanged;

    当我播放的时候这样:

    var stream = await file.OpenAsync(FileAccessMode.Read);
    await Window.Current.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
    {
           player.SetSource(stream, file.ContentType);
    });

    歌曲可以正常播放,但是不会触发MediaElement的任何事件,包括MediaOpened、以及上面的CurrentStateChanged 等等,而且对player的设置,例如Volume,Position等都是无效的。

    但是如果把MediaElement当作控件添加到界面中(通过Xaml方式),则一切都正常工作。这是为什么?

    还有一个小问题,调试的时候发现不管什么时候(包括正在播放,或者通过SetSource和对Source赋值)MediaElement的Source属性总是null,这又是怎么回事?





    • 已编辑 19198926 2012年8月26日 9:12
    2012年8月26日 3:43

答案

  • 自己理解,如果你不想加到VisualTree中,以前可以用MediaPlayer代替MediaElement,不过MediaPlayer在RC版已经去掉了,JS中还可以用

    现在顺便搜了一下,参考Media API


    MediaElement is a UIElement that is supported by The Layout System and can be consumed as the content of many controls. It is also usable in Extensible Application Markup Language (XAML) as well as code. MediaPlayer, on the other hand, is designed for Drawing objects and lacks layout support. Media loaded using a MediaPlayer can only be presented using a VideoDrawing or by directly interacting with a DrawingContext. MediaPlayer cannot be used in XAML.

    For more information on Drawing objects and Drawing Context, see Drawing Objects Overview.

    • 已编辑 Jie BaoModerator 2012年8月28日 5:10 change the text style
    • 已标记为答案 19198926 2012年8月28日 5:48
    2012年8月28日 2:40

全部回复

  • MediaElement player;

    player = new MediaElement();

    player.AudioCategory = AudioCategory.BackgroundCapableMedia;

    player.AutoPlay = true;
    player.CurrentStateChanged += player_CurrentStateChanged;

    当我播放的时候这样:

    var stream = await file.OpenAsync(FileAccessMode.Read);
    await Window.Current.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
    {
           player.SetSource(stream, file.ContentType);
    });

    歌曲可以正常播放,但是不会触发MediaElement的任何事件,包括MediaOpened、以及上面的CurrentStateChanged 等等,而且对player的设置,例如Volume,Position等都是无效的。

    但是如果把MediaElement当作控件添加到界面中(通过Xaml方式),则一切都正常工作。这是为什么?

    还有一个小问题,调试的时候发现不管什么时候(包括正在播放,或者通过SetSource和对Source赋值)MediaElement的Source属性总是null,这又是怎么回事?





    来人呀~。~
    2012年8月26日 10:01
  • 求高手解答啊,没有愿意回答么~~。
    2012年8月27日 8:31
  • 因为MediaElement是一个UIElement,必须添加到可视树中才能正常使用
    2012年8月27日 9:35
  • 谢谢troyou,我想问一下这个是你自己的理解,还是…………我记得wpf里面好像没有这个说法哎~~
    2012年8月27日 14:37
  • 自己理解,如果你不想加到VisualTree中,以前可以用MediaPlayer代替MediaElement,不过MediaPlayer在RC版已经去掉了,JS中还可以用

    现在顺便搜了一下,参考Media API


    MediaElement is a UIElement that is supported by The Layout System and can be consumed as the content of many controls. It is also usable in Extensible Application Markup Language (XAML) as well as code. MediaPlayer, on the other hand, is designed for Drawing objects and lacks layout support. Media loaded using a MediaPlayer can only be presented using a VideoDrawing or by directly interacting with a DrawingContext. MediaPlayer cannot be used in XAML.

    For more information on Drawing objects and Drawing Context, see Drawing Objects Overview.

    • 已编辑 Jie BaoModerator 2012年8月28日 5:10 change the text style
    • 已标记为答案 19198926 2012年8月28日 5:48
    2012年8月28日 2:40
  • Troyou理解是完全对的,当然文档中也有说明,看 http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh986967

    MediaElement does not contain a user interface; it simply renders the video to the display or the audio to the speakers. However, MediaElement does expose a rich set of methods, properties, and events to control media playback. To make this functionality available to the user, you must create the UI and add event handlers to interact with the MediaElement object. 

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年8月28日 5:29
    版主
  • 谢谢,学习了
    2012年8月28日 5:48