在WPF 中可以使用MediaElement 為應用程式添加媒體播放控制項,以完成播放音頻、視頻功能。由於MediaElement 屬於UIElement,所以它同時也支援滑鼠及鍵盤的操作。本篇將使用MediaElement 類和Windows API Code Pack 建立一個簡單的視頻播放器實現一些準系統。
介面架構
在XAML 中放入一個MediaElement 控制項(可使用視訊播放),五個Button 控制項(分別用於“開啟視頻文檔”、“播放/暫停”、“停止”、“快退”、“快進”),一個Slider 控制項(控制音量)。
<StackPanel HorizontalAlignment="Center" Margin="20"> <Border BorderThickness="3" Background="Black"> <Border.BorderBrush> <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"> <GradientStop Offset="0" Color="White"/> <GradientStop Offset="0.5" Color="Gold"/> </LinearGradientBrush> </Border.BorderBrush> <MediaElement Height="300" Width="450" Name="mediaElement"
Volume="0.5" LoadedBehavior="Manual"
MouseLeftButtonUp="mediaElement_MouseLeftButtonUp"/> </Border> <StackPanel Orientation="Horizontal" Height="40" HorizontalAlignment="Center"> <Button x:Name="openBtn" Content="Open File" Style="{StaticResource btnStyle}" Click="openBtn_Click"/> <Button x:Name="playBtn" Content="Play" Style="{StaticResource btnStyle}" Click="playBtn_Click"/> <Button x:Name="stopBtn" Content="Stop" Style="{StaticResource btnStyle}" Click="stopBtn_Click"/> <Button x:Name="backBtn" Content="Back" Style="{StaticResource btnStyle}" Click="backBtn_Click"/> <Button x:Name="forwardBtn" Content="Forward" Style="{StaticResource btnStyle}" Click="forwardBtn_Click"/> </StackPanel> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="5"> <TextBlock Text="Volume" Foreground="Gold"/> <Slider x:Name="volumeSlider" Minimum="0" Maximum="1" Value="0.5" Width="200"/> </StackPanel></StackPanel>
注意,MediaElement 的LoadedBehavior 需要設定為Manual,這樣才可以手動控制視頻的播放狀態。
介面樣式
上面代碼中已經為部分控制項設定了一些簡單樣式,其中Button 控制項通過靜態資源btnStyle 進行了較為複雜的樣式設定。首先修改了Button 的預設樣式,並且在滑鼠移至上方時字型顏色也會產生變化。
<Window.Resources> <Style x:Key="btnStyle" TargetType="Button"> <Setter Property="Background"> <Setter.Value> <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"> <GradientStop Offset="0" Color="White"/> <GradientStop Offset="0.5" Color="#FF554D4A"/> </LinearGradientBrush> </Setter.Value> </Setter> <Setter Property="FontStyle" Value="Italic"/> <Setter Property="Margin" Value="5"/> <Setter Property="Width" Value="60"/> <Setter Property="Foreground" Value="Gold"/> <Style.Triggers> <Trigger Property="Button.IsMouseOver" Value="True"> <Setter Property="Foreground" Value="Black"/> </Trigger> </Style.Triggers> </Style></Window.Resources>
瀏覽視頻檔案
在視頻檔案瀏覽部分引入Windows API Code Pack,使用KnownFolders 類將檔案瀏覽視窗直接定位到媒體庫的Sample Videos 目錄,並添加WMV、AVI 檔案過濾器。
private void openBtn_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) { mediaElement.Source = new Uri(cfd.FileName, UriKind.Relative); playBtn.IsEnabled = true; }}
播放/暫停
在視頻播放過程中可以通過點擊“Play/Pause” 按鍵或“MediaElement” 視窗,對視頻進行“播放/暫停”操作。
private void PlayerPause(){ SetPlayer(true); if (playBtn.Content.ToString() == "Play") { mediaElement.Play(); playBtn.Content = "Pause"; mediaElement.ToolTip = "Click to Pause"; } else { mediaElement.Pause(); playBtn.Content = "Play"; mediaElement.ToolTip = "Click to Play"; }}private void playBtn_Click(object sender, RoutedEventArgs e){ PlayerPause();}private void mediaElement_MouseLeftButtonUp(object sender, MouseButtonEventArgs e){ PlayerPause();}
快退/快進
通過修改MediaElement 的Position 值實現視頻進度調整操作。時間間隔通過TimeSpan 進行設定(下面代碼以10秒為間隔)。
private void backBtn_Click(object sender, RoutedEventArgs e){ mediaElement.Position = mediaElement.Position - TimeSpan.FromSeconds(10);}private void forwardBtn_Click(object sender, RoutedEventArgs e){ mediaElement.Position = mediaElement.Position + TimeSpan.FromSeconds(10);}
音量大小
音量大小部分只需將Slider Value 變化值與MediaElement Volume 值做一個簡單Binding 即可。
......<MediaElement Height="300" Width="450" Name="mediaElement" LoadedBehavior="Manual"
Volume="{Binding ElementName=volumeSlider, Path=Value}" MouseLeftButtonUp="mediaElement_MouseLeftButtonUp"/>......
來源程式下載