上一篇通過MediaElement 控制項在WPF 4 中製作了簡單的媒體播放器。本篇將直接把Windows Media Player 嵌入WPF 中實現同樣的效果。起初建立該執行個體是基於.Net Framework 4.0 完成後編譯順利通過,但F5 時出現了問題。提示無法載入Interop.WMPLib,調試了許久也沒搞出個明堂。最後轉用.Net 3.5 問題解決,難道是4.0 不支援?感興趣的朋友可下載代碼進一步研究。
建立項目
1. 建立一個基於.Net Framework 3.5 的WPF 應用程式項目:WPFWMP。
2. 在工程中建立Windows Forms Control Library 項目:WMPControlLibrary。
建立WMP 控制項
下面要在WMPControlLibrary 中建立Windows Media Player 控制項,在項目中加入Windows Media Player COM。
在左側工具列中若沒有Windows Media Player 控制項的話,可以右鍵General 選擇Choose Items,在COM 組件列表中勾選Windows Media Player 選項。
將Windows Media Player 控制項拖入設計視窗,並將Dock 設定為Fill 填充控制項。
控制項:
F6 編譯項目後會產生以下三個DLL 檔案,這就是我們稍後將要在WPF 中用到的WMP 控制項陳列庫。
嵌入WMP 控制項
回到WPF 項目在前篇文章的基礎上,保留其中“Open File” 按鍵和Button 樣式。將上面三個DLL 檔案及System.Windows.Forms、WindowsFormsIntegration 加入項目。
在XAML 中加入AxWMPLib 命名空間,並將上篇MediaElement 替換為AxWindowsMediaPlayer 控制項,注意此處是將WinForm 控制項嵌入WPF 程式,所以要將AxWindowsMediaPlayer 控制項放到<WindowsFormsHost>標籤中。
<Window x:Class="WPFWMP.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mediaControl="clr-namespace:AxWMPLib;assembly=AxInterop.WMPLib" Title="WPF Media Player" Height="450" Width="520" Background="#FF554D4D"> <Window.Resources> <Style x:Key="btnStyle" TargetType="Button"> … …
</Style> </Window.Resources> <StackPanel HorizontalAlignment="Center" Margin="10"> <Border BorderThickness="3" Background="Black"> … …
<WindowsFormsHost Height="340" Width="450"> <mediaControl:AxWindowsMediaPlayer x:Name="wpfMediaPlayer"/> </WindowsFormsHost> </Border> <Button Content="Open File" Click="openFile_Click" Margin="10" Width="80" Style="{StaticResource btnStyle}"/> </StackPanel></Window>
通過Windows API Code Pack 為“Open File” 按鍵添加點擊事件,預設開啟Sample Video 檔案夾,選擇視頻檔案後自動播放。
private void openFile_Click(object sender, RoutedEventArgs e){ ShellContainer selectedFolder = null; selectedFolder = KnownFolders.SampleVideos as ShellContainer; CommonOpenFileDialog cfd = new CommonOpenFileDialog(); cfd.InitialDirectoryShellContainer = selectedFolder; cfd.EnsureReadOnly = true; cfd.Filters.Add(new CommonFileDialogFilter("WMV Files", "*.wmv")); cfd.Filters.Add(new CommonFileDialogFilter("AVI Files", "*.avi")); cfd.Filters.Add(new CommonFileDialogFilter("MP3 Files", "*.mp3")); if (cfd.ShowDialog() == CommonFileDialogResult.OK) { wpfMediaPlayer.URL = cfd.FileName; }}
原始碼下載