Skip to content

Commit a7770fe

Browse files
Updating guidance on how to properly detach and close mediaPlayer from MPE.
1 parent 0313a6a commit a7770fe

1 file changed

Lines changed: 56 additions & 1 deletion

File tree

windows.ui.xaml.controls/mediaplayerelement.md

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ For info about the media formats that MediaPlayerElement supports, see [Supporte
2929

3030
### Architectural overview
3131

32-
MediaPlayerElement is a lightweight XAML control that serves as a rendering surface for the robust [MediaPlayer](../windows.media.playback/mediaplayer.md) class, which is part of the [Windows.Media.Playback](../windows.media.playback/windows_media_playback.md) namespace. The majority of the media functionality is located on the underlying [MediaPlayer](../windows.media.playback/mediaplayer.md) class, which you can access through the [MediaPlayerElement.MediaPlayer](mediaplayerelement_mediaplayer.md) property. To change the underlying [MediaPlayer](../windows.media.playback/mediaplayer.md) for an instance of MediaPlayerElement, use the [SetMediaPlayer](mediaplayerelement_setmediaplayer_932380017.md) method.
32+
MediaPlayerElement is a lightweight XAML control that serves as a rendering surface for the robust [MediaPlayer](../windows.media.playback/mediaplayer.md) class, which is part of the [Windows.Media.Playback](../windows.media.playback/windows_media_playback.md) namespace. The majority of the media functionality is located on the underlying [MediaPlayer](../windows.media.playback/mediaplayer.md) class, which you can access through the [MediaPlayerElement.MediaPlayer](mediaplayerelement_mediaplayer.md) property.
3333

3434
For more information about the [MediaPlayer](../windows.media.playback/mediaplayer.md) class, including guidelines on how to transition from [MediaElement](mediaelement.md) to MediaPlayerElement, see the [Media playback](/windows/uwp/audio-video-camera/media-playback) page.
3535

@@ -53,6 +53,60 @@ mediaPlayerElement1.Source = MediaSource.CreateFromUri(new Uri("ms-appx:///Media
5353
mediaPlayerElement1.AutoPlay = true;
5454
```
5555

56+
### Set the underlying media player
57+
When the [Source](mediaplayerelement_source.md) property or [AutoPlay](mediaelement_autoplay.md) property is set on MediaPlayerElement, it will automatically create an underlying [MediaPlayer](../windows.media.playback/mediaplayer.md) if one doesn't already exist. Alternatively, the user can create their own [MediaPlayer](../windows.media.playback/mediaplayer.md) and set it on MediaPlayerElement using the [SetMediaPlayer](mediaplayerelement_setmediaplayer_932380017.md) method. Here's example of how to set the underlying [MediaPlayer](../windows.media.playback/mediaplayer.md) in code.
58+
59+
60+
```xaml
61+
<MediaPlayerElement x:Name="mpe"/>
62+
```
63+
64+
```csharp
65+
MediaPlayer mediaPlayer = new MediaPlayer();
66+
mpe.SetMediaPlayer(mediaPlayer);
67+
mpe.Source = MediaSource.CreateFromUri(new Uri("ms-appx:///Media/video1.mp4"));
68+
mpe.AutoPlay = true;
69+
```
70+
> [!NOTE]
71+
> Setting MediaPlayerElement properties will set the corresponding properties on its underlying [MediaPlayer](../windows.media.playback/mediaplayer.md). You have the option to use the underlying [MediaPlayer](../windows.media.playback/mediaplayer.md) directly instead of using MediaPlayerElement properties. Be aware that using [MediaPlayer](../windows.media.playback/mediaplayer.md) directly where an equivalent MediaPlayerElement property could otherwise be used can cause unexpected behavior. This is because the MediaPlayerElement is not aware of everything happening to its underlying [MediaPlayer](../windows.media.playback/mediaplayer.md). For example, if you set the source directly on [MediaPlayer](../windows.media.playback/mediaplayer.md), then MediaPlayerElement's [Source](mediaplayerelement_source.md) property will not reflect the change. For this reason, you must be consistent in using MediaPlayerElement properties or directly using the underlying [MediaPlayer](../windows.media.playback/mediaplayer.md). This documentation will use MediaPlayerElement properties whenever possible.
72+
73+
### Detach the underlying media player
74+
The [MediaPlayer](../windows.media.playback/mediaplayer.md) is detached from MediaPlayerElement when the MediaPlayerElement is destroyed or when a new [MediaPlayer](../windows.media.playback/mediaplayer.md) is set using [SetMediaPlayer](mediaplayerelement_setmediaplayer_932380017.md). When detached, MediaPlayerElement treats the underlying [MediaPlayer](../windows.media.playback/mediaplayer.md) differently depending on whether it was created by MediaPlayerElement or set using [SetMediaPlayer](mediaplayerelement_setmediaplayer_932380017.md).
75+
76+
If the [MediaPlayer](../windows.media.playback/mediaplayer.md) was created by MediaPlayerElement, it will properly [Close](../windows.media.playback/mediaplayer_close_811482585.md) the [MediaPlayer](../windows.media.playback/mediaplayer.md) for you.
77+
78+
If the [MediaPlayer](../windows.media.playback/mediaplayer.md) was set on MediaPlayerElement using [SetMediaPlayer](mediaplayerelement_setmediaplayer_932380017.md), you are responsible for ensuring the [MediaPlayer](../windows.media.playback/mediaplayer.md) is properly closed. Failing to do so may result in fatal playback errors in [MediaPlayer](../windows.media.playback/mediaplayer.md). Here's how to properly detach and [Close](../windows.media.playback/mediaplayer_close_811482585.md) [MediaPlayer](../windows.media.playback/mediaplayer.md) in code.
79+
80+
```xaml
81+
<MediaPlayerElement x:Name="mpe"/>
82+
```
83+
84+
```csharp
85+
MediaPlayer mediaPlayer = mpe.MediaPlayer;
86+
IMediaPlaybackSource source = mpe.Source;
87+
88+
// 1. Pause playback if able.
89+
if (mediaPlayer.PlaybackSession.CanPause)
90+
{
91+
mediaPlayer.Pause();
92+
}
93+
94+
// 2. Disconnect the MediaPlayer from its source. This can be done by setting
95+
// the MediaPlayerElement Source property to null or by directly setting the
96+
// source to null on the underlying MediaPlayer.
97+
mpe.Source = null;
98+
99+
// 3. Disconnect the MediaPlayer from MediaPlayerElement.
100+
mpe.SetMediaPlayer(null);
101+
102+
// 4. Dispose of the MediaPlayer or Source if they're no longer needed.
103+
if (source is MediaSource mediaSource)
104+
{
105+
mediaSource.Dispose();
106+
}
107+
mediaPlayer.Dispose();
108+
```
109+
56110
### Handle media events
57111

58112
You can respond to common media events located on the underlying [MediaPlayer](../windows.media.playback/mediaplayer.md) such as [MediaOpened](../windows.media.playback/mediaplayer_mediaopened.md), [MediaEnded](../windows.media.playback/mediaplayer_mediaended.md), and [MediaFailed](../windows.media.playback/mediaplayer_mediafailed.md). If you have set the source to a [MediaPlaybackItem](../windows.media.playback/mediaplaybackitem.md) or [MediaPlaybackList](../windows.media.playback/mediaplaybacklist.md), you should respond to the media events on those classes instead as they provide more information.
@@ -137,6 +191,7 @@ You can use the [PosterSource](mediaplayerelement_postersource.md) property to p
137191
+ When media is streaming to another device.
138192
+ When the media is audio only.
139193

194+
140195
## -examples
141196

142197
> [!TIP]

0 commit comments

Comments
 (0)