標籤:
MediaElement 是一個 UIElement,它受 布局系統 支援並可用作許多控制項的內容。它也可用在可擴充應用程式標記語言 (XAML) 以及代碼中。另一方面,MediaPlayer 用於 Drawing 對象,因而缺少對布局的支援。只能使用 VideoDrawing 或通過直接與 DrawingContext 進行互動來呈現使用 MediaPlayer 載入的媒體。不能在 XAML 中使用 MediaPlayer。
說明: 如果將媒體與應用程式一起分發,則不能將媒體檔案用作項目資源。在專案檔中,必須將媒體類型改設為 Content,並將 CopyToOutputDirectory 設定為 PreserveNewest 或 Always。
媒體播放模式 說明: MediaElement 和 MediaPlayer 具有類似的成員。本部分中的連結指的是 MediaElement 類成員。除非明確說明,否則連結到 MediaElement 類中的成員也可在 MediaPlayer 類中找到。
若要瞭解 Windows Presentation Foundation (WPF) 中的媒體播放,需要先瞭解可播放媒體的不同模式。MediaElement 和 MediaPlayer 可以用於兩種不同的媒體模式中:獨立模式和時鐘模式。媒體模式由 Clock 屬性確定。如果 Clock 為 null,則媒體對象處於獨立模式。如果 Clock 不為 null,則媒體對象處於時鐘模式。預設情況下,媒體對象處於獨立模式。
獨立模式 在獨立模式下,由媒體內容驅動媒體播放。獨立模式實現了下列功能選項:
可直接指定媒體的 Uri。
可直接控制媒體播放。
可修改媒體的 Position 和 SpeedRatio 屬性。
通過設定 MediaElement 對象的 Source 屬性或者調用 MediaPlayer 對象的 Open 方法來載入媒體。
若要在獨立模式下控制媒體播放,可使用媒體對象的控制方法。提供了下列控制方法:Play、Pause、Close 和 Stop。對於 MediaElement,僅當將 LoadedBehavior 設定為 Manual 時,使用這些方法的互動式控制項才可用。當媒體對象處於時鐘模式時,這些方法將不可用。
時鐘模式 在時鐘模式下,由 MediaTimeline 驅動媒體播放。時鐘模式具有下列特徵:
媒體的 Uri 是通過 MediaTimeline 間接設定的。
可由時鐘控制媒體播放。不能使用媒體對象的控制方法。
可通過以下方法載入媒體:設定 MediaTimeline 對象的 Source 屬性,從時間軸建立時鐘,並將時鐘分配給媒體對象。當位於 Storyboard 中的 MediaTimeline 針對 MediaElement 時,也可用這種方法載入媒體。
若要在時鐘模式下控制媒體播放,必須使用 ClockController 控制方法。ClockController 是從 MediaClock 的 ClockController 屬性擷取的。如果嘗試在時鐘模式下使用 MediaElement 或 MediaPlayer 對象的控制方法,則會引發 InvalidOperationException。
MediaElement 類 嚮應用程式添加媒體的操作十分簡單,只需嚮應用程式的使用者介面 (UI) 添加 MediaElement 控制項,並為要包含的媒體提供 Uri。Windows Presentation Foundation (WPF) 中支援 Microsoft Windows Media Player 10 所支援的所有媒體類型。下面的樣本示範 MediaElement 在可擴充應用程式標記語言 (XAML) 中的簡單用法。
在此樣本中,媒體在載入後即會自動播放。播放完後,就會關閉媒體,並且會釋放所有媒體資源(包括視頻記憶體)。此行為是 MediaElement 對象的預設行為,由 LoadedBehavior 和 UnloadedBehavior 屬性控制。
控制 MediaElement 當 IsLoaded 為 true 或 false 時,可分別使用 LoadedBehavior 和 UnloadedBehavior 屬性控制 MediaElement 的行為。設定 MediaState 屬性的目的是影響媒體播允許存取為。例如,預設的 LoadedBehavior 為 Play,而預設的 UnloadedBehavior 為 Close。這意味著載入 MediaElement 並完成預播放後,即會開始播放媒體。播放完後,就會關閉媒體,並且會釋放所有媒體資源。
LoadedBehavior 和 UnloadedBehavior 屬性不是控制媒體播放的唯一方法。在時鐘模式下,時鐘可以控制 MediaElement,並且這些互動式控制方法在 LoadedBehavior 為 Manual 時具有控制權。MediaElement 通過計算下列優先順序來處理此控制權的競爭。
UnloadedBehavior. 在卸載媒體時發生。這可確保預設情況下釋放所有媒體資源,即使 MediaClock 與 MediaElement 關聯也是如此。
MediaClock. 在媒體具有 Clock 時發生。如果卸載媒體,則只要 UnloadedBehavior 為 Manual,MediaClock 就會生效。時鐘模式始終重寫 MediaElement 的載入行為。
LoadedBehavior. 在載入媒體時發生。
互動式控制方法。在 LoadedBehavior 為 Manual 時發生。提供了下列控制方法:Play、Pause、Close 和 Stop。
顯示 MediaElement 若要顯示 MediaElement,它必須具有要呈現的內容,並在載入內容之前將其 ActualWidth 和 ActualHeight 屬性設定為零。對於僅包含音訊內容,這些屬性將始終為零。對於視頻內容,在 MediaOpened 事件引發 ActualWidth 和 ActualHeight 後,會報告已載入媒體的大小。這意味著在載入媒體之前,MediaElement 不會佔用使用者介面 (UI) 中的任何物理空間,除非設定了 Width 或 Height 屬性。
如果設定 Width 和 Height 屬性,則會導致展開媒體來填充為 MediaElement 提供的地區。若要保持媒體的原始縱橫比,應設定 Width 或 Height 屬性,但不能同時設定這兩者。如果同時設定 Width 和 Height 屬性,則會使媒體以固定元素大小顯示,可能無法達到預期效果。
為避免元素大小固定,Windows Presentation Foundation (WPF) 可以預播放媒體。為此,需要將 LoadedBehavior 設定為 Play 或 Pause。在 Pause 狀態下,媒體將預播放第一幀。在 Play 狀態下,媒體將預播放,然後再開始播放。
MediaPlayer 類 當 MediaElement 類為架構元素時,MediaPlayer 類設計為在 Drawing 對象中使用。在可犧牲架構級功能來獲得效能的提高或者需要 Freezable 功能時,可使用 Drawing 對象。通過 MediaPlayer,您可以在應用程式中提供媒體內容,同時使用這些功能。與 MediaElement 類似,MediaPlayer 可在獨立模式或時鐘模式下使用,但不具有 MediaElement 對象的卸載和載入狀態。這會降低 MediaPlayer 的播放控制的複雜程度。
控制 MediaPlayer 由於 MediaPlayer 是無狀態的,因此只能使用兩種方法控制媒體播放。
互動式控制方法。在處於獨立模式(null Clock 屬性)時採用。
MediaClock. 在媒體具有 Clock 時採用。
顯示 MediaPlayer 從技術角度來說,不能顯示 MediaPlayer,因為它沒有物理表示形式。但它可用於通過使用 VideoDrawing 類在 Drawing 中呈現媒體。下面的樣本示範如何使用 VideoDrawing 顯示媒體。
詳細請參考:http://www.codesky.net/article/200808/130108.html
MediaElement 的兩種模式