mirror of
https://github.com/QL-Win/QuickLook.git
synced 2025-09-11 17:59:17 +00:00
modernise video player UI
This commit is contained in:
@@ -57,4 +57,22 @@ namespace QuickLook.Plugin.VideoViewer
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class BooleanToVisibilityHiddenConverter : DependencyObject, IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (value == null)
|
||||
return Visibility.Hidden;
|
||||
|
||||
var v = (bool) value;
|
||||
|
||||
return v ? Visibility.Hidden : Visibility.Visible;
|
||||
}
|
||||
|
||||
object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,75 +0,0 @@
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
<Style x:Key="SliderRepeatButton" TargetType="RepeatButton">
|
||||
<Setter Property="SnapsToDevicePixels" Value="true" />
|
||||
<Setter Property="OverridesDefaultStyle" Value="true" />
|
||||
<Setter Property="IsTabStop" Value="false" />
|
||||
<Setter Property="Focusable" Value="false" />
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="RepeatButton">
|
||||
<Border BorderThickness="1" BorderBrush="Gray" Background="Gray" Height="3" />
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<Style x:Key="SliderRepeatButton1" TargetType="RepeatButton">
|
||||
<Setter Property="SnapsToDevicePixels" Value="true" />
|
||||
<Setter Property="OverridesDefaultStyle" Value="true" />
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="RepeatButton">
|
||||
<Border SnapsToDevicePixels="True" Background="Gray" BorderThickness="1" BorderBrush="Gray"
|
||||
Height="3" />
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<Style x:Key="SliderThumb" TargetType="Thumb">
|
||||
<Setter Property="SnapsToDevicePixels" Value="true" />
|
||||
<Setter Property="OverridesDefaultStyle" Value="true" />
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="Thumb">
|
||||
<Ellipse Height="12" Width="12" Fill="Gray" />
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<ControlTemplate x:Key="Slider" TargetType="Slider">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" MinHeight="{TemplateBinding MinHeight}" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
<Track Grid.Row="1" x:Name="PART_Track">
|
||||
<Track.DecreaseRepeatButton>
|
||||
<RepeatButton Style="{StaticResource SliderRepeatButton1}" Command="Slider.DecreaseLarge" />
|
||||
</Track.DecreaseRepeatButton>
|
||||
<Track.Thumb>
|
||||
<Thumb Style="{StaticResource SliderThumb}" />
|
||||
</Track.Thumb>
|
||||
<Track.IncreaseRepeatButton>
|
||||
<RepeatButton Style="{StaticResource SliderRepeatButton}" Command="Slider.IncreaseLarge" />
|
||||
</Track.IncreaseRepeatButton>
|
||||
</Track>
|
||||
</Grid>
|
||||
</ControlTemplate>
|
||||
|
||||
<Style x:Key="HorizontalSlider" TargetType="Slider">
|
||||
<Setter Property="Focusable" Value="False" />
|
||||
<Setter Property="SnapsToDevicePixels" Value="true" />
|
||||
<Setter Property="OverridesDefaultStyle" Value="true" />
|
||||
<Style.Triggers>
|
||||
<Trigger Property="Orientation" Value="Horizontal">
|
||||
<Setter Property="MinHeight" Value="10" />
|
||||
<Setter Property="MinWidth" Value="104" />
|
||||
<Setter Property="Template" Value="{StaticResource Slider}" />
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</ResourceDictionary>
|
@@ -57,8 +57,6 @@ namespace QuickLook.Plugin.VideoViewer
|
||||
using (var element = new MediaElement {Source = new Uri(path)})
|
||||
{
|
||||
context.SetPreferredSizeFit(new Size(element.NaturalVideoWidth, element.NaturalVideoHeight), 0.6);
|
||||
context.PreferredSize = new Size(context.PreferredSize.Width,
|
||||
context.PreferredSize.Height + 26); // add control bar
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -70,7 +70,7 @@
|
||||
<Reference Include="PresentationFramework" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Page Include="HorizontalSliderStyle.xaml">
|
||||
<Page Include="Styles.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
@@ -81,7 +81,7 @@
|
||||
<Compile Include="..\..\GitVersion.cs">
|
||||
<Link>Properties\GitVersion.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="DoubleToHMSConverter.cs" />
|
||||
<Compile Include="Converters.cs" />
|
||||
<Compile Include="Plugin.cs" />
|
||||
<Compile Include="ViewerPanel.xaml.cs">
|
||||
<DependentUpon>ViewerPanel.xaml</DependentUpon>
|
||||
|
228
QuickLook.Plugin/QuickLook.Plugin.VideoViewer/Styles.xaml
Normal file
228
QuickLook.Plugin/QuickLook.Plugin.VideoViewer/Styles.xaml
Normal file
@@ -0,0 +1,228 @@
|
||||
<!--
|
||||
This file is a part of unosquare/ffmediaelement project: <https://github.com/unosquare/ffmediaelement>
|
||||
-->
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
<Style x:Key="ControlButtonStyle" TargetType="Grid">
|
||||
<Setter Property="Height" Value="50" />
|
||||
<Setter Property="Width" Value="50" />
|
||||
<Setter Property="Cursor" Value="Hand" />
|
||||
<Setter Property="VerticalAlignment" Value="Center" />
|
||||
<Setter Property="HorizontalAlignment" Value="Center" />
|
||||
<Setter Property="Background" Value="Transparent" />
|
||||
<Style.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter Property="Background" Value="#22FFFFFF" />
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
|
||||
<SolidColorBrush x:Key="CustomSliderForegroundBrush" Color="#FFEFEFEF" />
|
||||
<SolidColorBrush x:Key="CustomSliderBackgroundBrush" Color="#55ffffff" />
|
||||
<SolidColorBrush x:Key="CustomSliderHighlightBrush" Color="#FFEFEFEF" />
|
||||
|
||||
<!-- Postion Slider Control -->
|
||||
<ControlTemplate x:Key="PositionSliderThumbTemplate" TargetType="{x:Type Thumb}">
|
||||
<Grid HorizontalAlignment="Center" UseLayoutRounding="True" VerticalAlignment="Center">
|
||||
<Path x:Name="grip" Data="M 0,0 A 180,180 180 1 1 1,1 Z" Fill="Transparent" Stretch="Fill"
|
||||
Stroke="{StaticResource CustomSliderForegroundBrush}" StrokeThickness="2.5" UseLayoutRounding="True"
|
||||
VerticalAlignment="Center"
|
||||
Margin="-1,-1" />
|
||||
</Grid>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsDragging" Value="true">
|
||||
<Setter Property="Fill" TargetName="grip" Value="{StaticResource CustomSliderForegroundBrush}" />
|
||||
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource CustomSliderForegroundBrush}" />
|
||||
</Trigger>
|
||||
<Trigger Property="IsEnabled" Value="false">
|
||||
<Setter Property="Visibility" TargetName="grip" Value="Hidden" />
|
||||
</Trigger>
|
||||
<Trigger Property="IsKeyboardFocused" Value="true">
|
||||
<Setter Property="Fill" TargetName="grip" Value="{StaticResource CustomSliderForegroundBrush}" />
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
<ControlTemplate x:Key="PositionSliderTemplate" TargetType="{x:Type Slider}">
|
||||
<Border x:Name="border" Background="Transparent" SnapsToDevicePixels="True">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="{TemplateBinding MinHeight}" />
|
||||
</Grid.RowDefinitions>
|
||||
<DockPanel LastChildFill="True">
|
||||
<Border ClipToBounds="True" x:Name="PART_SelectionRange" Height="3" Visibility="Visible">
|
||||
<Rectangle RadiusX="1" RadiusY="1" Margin="10,0,-10,0"
|
||||
Fill="{StaticResource CustomSliderForegroundBrush}" />
|
||||
</Border>
|
||||
<Border ClipToBounds="True" Height="3" Visibility="Visible">
|
||||
<Rectangle RadiusX="1" RadiusY="1" Margin="20,0,10,0"
|
||||
Fill="{StaticResource CustomSliderBackgroundBrush}" />
|
||||
</Border>
|
||||
</DockPanel>
|
||||
<Track x:Name="PART_Track">
|
||||
<Track.Thumb>
|
||||
<Thumb x:Name="Thumb" Focusable="False" Width="{TemplateBinding MinHeight}"
|
||||
Height="{TemplateBinding MinHeight}"
|
||||
OverridesDefaultStyle="True" Template="{StaticResource PositionSliderThumbTemplate}"
|
||||
VerticalAlignment="Center" />
|
||||
</Track.Thumb>
|
||||
</Track>
|
||||
</Grid>
|
||||
</Border>
|
||||
</ControlTemplate>
|
||||
<Style x:Key="PositionSliderStyle" TargetType="{x:Type Slider}">
|
||||
<Setter Property="Stylus.IsPressAndHoldEnabled" Value="false" />
|
||||
<Setter Property="Background" Value="Transparent" />
|
||||
<Setter Property="BorderBrush" Value="Transparent" />
|
||||
<Setter Property="MinHeight" Value="20" />
|
||||
<Setter Property="MaxHeight" Value="20" />
|
||||
<Setter Property="Height" Value="20" />
|
||||
<Setter Property="Minimum" Value="0" />
|
||||
<Setter Property="AutoToolTipPlacement" Value="None" />
|
||||
<Setter Property="IsMoveToPointEnabled" Value="True" />
|
||||
<Setter Property="VerticalAlignment" Value="Center" />
|
||||
<Setter Property="SelectionStart" Value="0" />
|
||||
<Setter Property="SelectionEnd" Value="{Binding Path=Value, RelativeSource={RelativeSource Self}}" />
|
||||
<Setter Property="Template" Value="{StaticResource PositionSliderTemplate}" />
|
||||
</Style>
|
||||
|
||||
<!-- Custom Slider Control -->
|
||||
<ControlTemplate x:Key="CustomSliderThumbTemplate" TargetType="{x:Type Thumb}">
|
||||
<Grid HorizontalAlignment="Center" UseLayoutRounding="True" VerticalAlignment="Center">
|
||||
<Rectangle x:Name="grip" Fill="{StaticResource CustomSliderForegroundBrush}" Width="8"
|
||||
Height="{Binding Path=Height, RelativeSource={RelativeSource TemplatedParent}}"
|
||||
StrokeThickness="0"
|
||||
UseLayoutRounding="True" Stretch="Fill" RadiusX="3" RadiusY="3" />
|
||||
</Grid>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsDragging" Value="true">
|
||||
<Setter Property="Fill" TargetName="grip" Value="{StaticResource CustomSliderHighlightBrush}" />
|
||||
</Trigger>
|
||||
<Trigger Property="IsEnabled" Value="false">
|
||||
<Setter Property="Fill" TargetName="grip" Value="{StaticResource CustomSliderBackgroundBrush}" />
|
||||
</Trigger>
|
||||
<Trigger Property="IsKeyboardFocused" Value="true">
|
||||
<Setter Property="Fill" TargetName="grip" Value="{StaticResource CustomSliderForegroundBrush}" />
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
<ControlTemplate x:Key="CustomSliderTemplate" TargetType="{x:Type Slider}">
|
||||
<Border x:Name="border" Background="Transparent" SnapsToDevicePixels="True">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="{TemplateBinding MinHeight}" />
|
||||
</Grid.RowDefinitions>
|
||||
<DockPanel LastChildFill="True">
|
||||
<Border ClipToBounds="True" x:Name="PART_SelectionRange" Height="3" Visibility="Visible">
|
||||
<Rectangle RadiusX="1" RadiusY="1" Margin="4,0,-4,0"
|
||||
Fill="{StaticResource CustomSliderForegroundBrush}" />
|
||||
</Border>
|
||||
<Border ClipToBounds="True" Height="3" Visibility="Visible">
|
||||
<Rectangle x:Name="PART_NegativeSelection" RadiusX="1" RadiusY="1" Margin="8,0,4,0"
|
||||
Fill="{StaticResource CustomSliderBackgroundBrush}" />
|
||||
</Border>
|
||||
</DockPanel>
|
||||
<Track x:Name="PART_Track">
|
||||
<Track.Thumb>
|
||||
<Thumb x:Name="Thumb" Focusable="False" Width="8" Height="{TemplateBinding MinHeight}"
|
||||
OverridesDefaultStyle="True" Template="{StaticResource CustomSliderThumbTemplate}"
|
||||
VerticalAlignment="Center" />
|
||||
</Track.Thumb>
|
||||
</Track>
|
||||
</Grid>
|
||||
</Border>
|
||||
</ControlTemplate>
|
||||
<Style x:Key="CustomSliderStyle" TargetType="{x:Type Slider}">
|
||||
<Setter Property="Stylus.IsPressAndHoldEnabled" Value="false" />
|
||||
<Setter Property="Background" Value="Transparent" />
|
||||
<Setter Property="BorderBrush" Value="Transparent" />
|
||||
<Setter Property="MinHeight" Value="26" />
|
||||
<Setter Property="MaxHeight" Value="26" />
|
||||
<Setter Property="Height" Value="26" />
|
||||
<Setter Property="Minimum" Value="0" />
|
||||
<Setter Property="IsSnapToTickEnabled" Value="True" />
|
||||
<Setter Property="SmallChange" Value="0.01" />
|
||||
<Setter Property="LargeChange" Value="0.01" />
|
||||
<Setter Property="TickFrequency" Value="0.01" />
|
||||
<Setter Property="AutoToolTipPlacement" Value="None" />
|
||||
<Setter Property="IsMoveToPointEnabled" Value="True" />
|
||||
<Setter Property="VerticalAlignment" Value="Center" />
|
||||
<Setter Property="SelectionStart" Value="{Binding Path=Minimum, RelativeSource={RelativeSource Self}}" />
|
||||
<Setter Property="SelectionEnd" Value="{Binding Path=Value, RelativeSource={RelativeSource Self}}" />
|
||||
<Setter Property="Template" Value="{StaticResource CustomSliderTemplate}" />
|
||||
</Style>
|
||||
|
||||
<Style x:Key="NetworkProgressBarStyle" TargetType="{x:Type ProgressBar}">
|
||||
<Setter Property="BorderThickness" Value="0" />
|
||||
<Setter Property="Height" Value="3" />
|
||||
<Setter Property="Margin" Value="10,0" />
|
||||
<Setter Property="Minimum" Value="0" />
|
||||
<Setter Property="Maximum" Value="1" />
|
||||
<Setter Property="Background" Value="{StaticResource CustomSliderBackgroundBrush}" />
|
||||
</Style>
|
||||
|
||||
<Style x:Key="ModernToggleButtonStyle" TargetType="ToggleButton">
|
||||
<Style.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter Property="Background" Value="#22FFFFFF" />
|
||||
</Trigger>
|
||||
<Trigger Property="IsPressed" Value="True">
|
||||
<Setter Property="Background" Value="#44FFFFFF" />
|
||||
</Trigger>
|
||||
<Trigger Property="IsChecked" Value="True">
|
||||
<Setter Property="Background" Value="#44FFFFFF" />
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
<Setter Property="BorderThickness" Value="0" />
|
||||
<Setter Property="Width" Value="45" />
|
||||
<Setter Property="Height" Value="45" />
|
||||
<Setter Property="Padding" Value="12" />
|
||||
<Setter Property="Background" Value="Transparent" />
|
||||
<Setter Property="Foreground" Value="{StaticResource CustomSliderHighlightBrush}" />
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="{x:Type ToggleButton}">
|
||||
<Border Background="{TemplateBinding Background}" BorderThickness="0"
|
||||
Padding="{TemplateBinding Padding}">
|
||||
<ContentPresenter x:Name="contentPresenter" HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center" />
|
||||
</Border>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<Style x:Key="ModernButtonStyle" TargetType="{x:Type Button}">
|
||||
<Style.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter Property="Background" Value="#22FFFFFF" />
|
||||
</Trigger>
|
||||
<Trigger Property="IsPressed" Value="True">
|
||||
<Setter Property="Background" Value="#44FFFFFF" />
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
<Setter Property="BorderThickness" Value="0" />
|
||||
<Setter Property="Width" Value="45" />
|
||||
<Setter Property="Height" Value="45" />
|
||||
<Setter Property="Padding" Value="12" />
|
||||
<Setter Property="Background" Value="Transparent" />
|
||||
<Setter Property="Foreground" Value="{StaticResource CustomSliderHighlightBrush}" />
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="{x:Type Button}">
|
||||
<Border Background="{TemplateBinding Background}" BorderThickness="0"
|
||||
Padding="{TemplateBinding Padding}">
|
||||
<ContentPresenter x:Name="contentPresenter" HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center" />
|
||||
</Border>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<Style x:Key="ControlsGridStyle" TargetType="{x:Type Grid}">
|
||||
<Setter Property="VerticalAlignment" Value="Bottom" />
|
||||
<Setter Property="Height" Value="250" />
|
||||
<Setter Property="Background" Value="{DynamicResource ShadedBackgroundBrush}" />
|
||||
</Style>
|
||||
|
||||
</ResourceDictionary>
|
@@ -7,50 +7,122 @@
|
||||
xmlns:local="clr-namespace:QuickLook.Plugin.VideoViewer"
|
||||
xmlns:ffmpeg="clr-namespace:Unosquare.FFmpegMediaElement;assembly=Unosquare.FFmpegMediaElement"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="300" d:DesignWidth="300">
|
||||
d:DesignHeight="449.167" d:DesignWidth="767">
|
||||
<Grid>
|
||||
<Grid.Resources>
|
||||
<ResourceDictionary>
|
||||
<local:DoubleToTimeSpanConverter x:Key="DoubleToTimeSpanConverter" />
|
||||
<local:DecimalToTimeSpanConverter x:Key="DecimalToTimeSpanConverter" />
|
||||
<local:BooleanToVisibilityHiddenConverter x:Key="BooleanToVisibilityHiddenConverter" />
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="HorizontalSliderStyle.xaml" />
|
||||
<ResourceDictionary Source="Styles.xaml" />
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</Grid.Resources>
|
||||
<DockPanel>
|
||||
<DockPanel DockPanel.Dock="Bottom" Height="26" Margin="-1,0,0,0">
|
||||
<fa:ImageAwesome DockPanel.Dock="Left" x:Name="buttonPlayPause" Icon="PauseCircleOutline"
|
||||
Height="16" Width="16" Margin="5,5" Foreground="Gray"
|
||||
Cursor="Hand" />
|
||||
<StackPanel DockPanel.Dock="Right" HorizontalAlignment="Center" VerticalAlignment="Center"
|
||||
Orientation="Horizontal" Margin="10,0,5,0">
|
||||
<TextBlock FontSize="14"
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="7*" />
|
||||
<RowDefinition Height="3*" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<ffmpeg:MediaElement Grid.RowSpan="255" x:Name="mediaElement" />
|
||||
|
||||
<Grid Grid.Row="1">
|
||||
<Grid.Background>
|
||||
<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
|
||||
<GradientStop Offset="0.0" Color="#00000000" />
|
||||
<GradientStop Offset="0.25" Color="#66000000" />
|
||||
<GradientStop Offset="1" Color="#D6000000" />
|
||||
</LinearGradientBrush>
|
||||
</Grid.Background>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*" />
|
||||
<RowDefinition Height="30" />
|
||||
<RowDefinition Height="75" />
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.Style>
|
||||
<Style TargetType="{x:Type Grid}">
|
||||
<Style.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Trigger.EnterActions>
|
||||
<BeginStoryboard>
|
||||
<Storyboard>
|
||||
<DoubleAnimation Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:0.2" />
|
||||
</Storyboard>
|
||||
</BeginStoryboard>
|
||||
</Trigger.EnterActions>
|
||||
<Trigger.ExitActions>
|
||||
<BeginStoryboard>
|
||||
<Storyboard>
|
||||
<DoubleAnimation Storyboard.TargetProperty="Opacity" To="0" Duration="0:0:0.2" />
|
||||
</Storyboard>
|
||||
</BeginStoryboard>
|
||||
</Trigger.ExitActions>
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</Grid.Style>
|
||||
|
||||
<Slider x:Name="sliderProgress" Style="{StaticResource PositionSliderStyle}"
|
||||
Value="{Binding Position, ElementName=mediaElement}"
|
||||
Maximum="{Binding NaturalDuration, ElementName=mediaElement, Mode=OneWay}" Grid.Row="1" />
|
||||
|
||||
<Grid Grid.Row="2">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<StackPanel Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center"
|
||||
Orientation="Horizontal" Margin="20,0,0,0">
|
||||
<Grid x:Name="buttonMute" Style="{StaticResource ControlButtonStyle}">
|
||||
<fa:ImageAwesome Height="30" Width="30" Foreground="#FFEFEFEF">
|
||||
<fa:ImageAwesome.Style>
|
||||
<Style TargetType="fa:ImageAwesome">
|
||||
<Setter Property="Icon" Value="VolumeOff" />
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding IsMuted, ElementName=mediaElement}"
|
||||
Value="False">
|
||||
<Setter Property="Icon" Value="VolumeUp" />
|
||||
</DataTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</fa:ImageAwesome.Style>
|
||||
</fa:ImageAwesome>
|
||||
</Grid>
|
||||
<Slider Style="{StaticResource CustomSliderStyle}" Width="80" Maximum="1"
|
||||
Value="{Binding Volume, ElementName=mediaElement}"
|
||||
Visibility="{Binding IsMuted, ElementName=mediaElement, Converter={StaticResource BooleanToVisibilityHiddenConverter}}" />
|
||||
</StackPanel>
|
||||
<StackPanel Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Center">
|
||||
<Grid x:Name="buttonPlayPause" Style="{StaticResource ControlButtonStyle}">
|
||||
<fa:ImageAwesome Height="30" Width="30" Foreground="#FFEFEFEF">
|
||||
<fa:ImageAwesome.Style>
|
||||
<Style>
|
||||
<Setter Property="fa:ImageAwesome.Icon" Value="Pause" />
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding IsPlaying, ElementName=mediaElement}"
|
||||
Value="False">
|
||||
<Setter Property="fa:ImageAwesome.Icon" Value="Play" />
|
||||
</DataTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</fa:ImageAwesome.Style>
|
||||
</fa:ImageAwesome>
|
||||
</Grid>
|
||||
<Grid Width="15" />
|
||||
<Grid x:Name="buttonStop" Style="{StaticResource ControlButtonStyle}">
|
||||
<fa:ImageAwesome Icon="Stop" Height="27" Width="27" Foreground="#FFEFEFEF" />
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
<StackPanel Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||
Orientation="Horizontal" Margin="0,0,20,0">
|
||||
<TextBlock FontSize="16" Foreground="#FFEFEFEF"
|
||||
Text="{Binding Position, ElementName=mediaElement,Converter={StaticResource DecimalToTimeSpanConverter}}" />
|
||||
<TextBlock FontSize="14" Text=" / " />
|
||||
<TextBlock FontSize="14"
|
||||
<TextBlock FontSize="16" Text=" / " Foreground="#FFEFEFEF" />
|
||||
<TextBlock FontSize="16" Foreground="#FFEFEFEF"
|
||||
Text="{Binding NaturalDuration, StringFormat=hh:mm:ss, ElementName=mediaElement,Converter={StaticResource DoubleToTimeSpanConverter}}" />
|
||||
</StackPanel>
|
||||
<Slider x:Name="sliderProgress" Style="{StaticResource HorizontalSlider}"
|
||||
Margin="0,0,0,0" VerticalAlignment="Center"
|
||||
Value="{Binding Position, ElementName=mediaElement}"
|
||||
Maximum="{Binding NaturalDuration, ElementName=mediaElement, Mode=OneWay}" />
|
||||
</DockPanel>
|
||||
<Grid>
|
||||
<ffmpeg:MediaElement x:Name="mediaElement" />
|
||||
<Border x:Name="buttonMute" VerticalAlignment="Bottom" HorizontalAlignment="Right" Cursor="Hand"
|
||||
Margin="10,10" Width="100" Height="100">
|
||||
<Border.Background>
|
||||
<SolidColorBrush Color="Gray" Opacity="0.9" />
|
||||
</Border.Background>
|
||||
<fa:ImageAwesome Icon="VolumeOff"
|
||||
Height="60" Width="60" Foreground="White" />
|
||||
</Border>
|
||||
</Grid>
|
||||
</DockPanel>
|
||||
<Label x:Name="errorOverlay" Visibility="Collapsed" Background="#CCAAAAAA" VerticalContentAlignment="Center"
|
||||
HorizontalContentAlignment="Center">
|
||||
Video load failed.
|
||||
</Label>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</UserControl>
|
@@ -16,12 +16,9 @@
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
using FontAwesome.WPF;
|
||||
using Unosquare.FFmpegMediaElement;
|
||||
|
||||
namespace QuickLook.Plugin.VideoViewer
|
||||
@@ -40,14 +37,14 @@ namespace QuickLook.Plugin.VideoViewer
|
||||
_context = context;
|
||||
|
||||
buttonPlayPause.MouseLeftButtonUp += TogglePlayPause;
|
||||
buttonMute.MouseLeftButtonUp += (sender, e) =>
|
||||
{
|
||||
mediaElement.IsMuted = false;
|
||||
buttonMute.Visibility = Visibility.Collapsed;
|
||||
};
|
||||
//buttonMute.MouseLeftButtonUp += (sender, e) =>
|
||||
//{
|
||||
// mediaElement.IsMuted = false;
|
||||
// buttonMute.Visibility = Visibility.Collapsed;
|
||||
//};
|
||||
buttonMute.MouseLeftButtonUp += (sender, e) => mediaElement.IsMuted = !mediaElement.IsMuted;
|
||||
buttonStop.MouseLeftButtonUp += (sender, e) => mediaElement.Stop();
|
||||
|
||||
mediaElement.PropertyChanged += ChangePlayPauseButton;
|
||||
mediaElement.MouseLeftButtonUp += TogglePlayPause;
|
||||
mediaElement.MediaErrored += ShowErrorNotification;
|
||||
mediaElement.MediaFailed += ShowErrorNotification;
|
||||
}
|
||||
@@ -55,6 +52,7 @@ namespace QuickLook.Plugin.VideoViewer
|
||||
public void Dispose()
|
||||
{
|
||||
mediaElement?.Dispose();
|
||||
mediaElement = null;
|
||||
}
|
||||
|
||||
private void TogglePlayPause(object sender, MouseButtonEventArgs e)
|
||||
@@ -65,16 +63,6 @@ namespace QuickLook.Plugin.VideoViewer
|
||||
mediaElement.Play();
|
||||
}
|
||||
|
||||
private void ChangePlayPauseButton(object sender, PropertyChangedEventArgs e)
|
||||
{
|
||||
if (e.PropertyName != "IsPlaying" && e.PropertyName != "HasMediaEnded")
|
||||
return;
|
||||
|
||||
buttonPlayPause.Icon = mediaElement.IsPlaying
|
||||
? FontAwesomeIcon.PauseCircleOutline
|
||||
: FontAwesomeIcon.PlayCircleOutline;
|
||||
}
|
||||
|
||||
[DebuggerNonUserCode]
|
||||
private void ShowErrorNotification(object sender, MediaErrorRoutedEventArgs e)
|
||||
{
|
||||
|
Reference in New Issue
Block a user