committed by
GitHub
9 changed files with 889 additions and 136 deletions
@ -0,0 +1,430 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using Avalonia.Controls.Primitives; |
|||
using Avalonia.Data; |
|||
using Avalonia.Data.Converters; |
|||
using Avalonia.Layout; |
|||
using Avalonia.Media; |
|||
using Avalonia.Utilities; |
|||
|
|||
namespace Avalonia.Controls |
|||
{ |
|||
|
|||
/// <summary>
|
|||
/// Enum which describes how to position the TickBar.
|
|||
/// </summary>
|
|||
public enum TickBarPlacement |
|||
{ |
|||
/// <summary>
|
|||
/// Position this tick at the left of target element.
|
|||
/// </summary>
|
|||
Left, |
|||
|
|||
/// <summary>
|
|||
/// Position this tick at the top of target element.
|
|||
/// </summary>
|
|||
Top, |
|||
|
|||
/// <summary>
|
|||
/// Position this tick at the right of target element.
|
|||
/// </summary>
|
|||
Right, |
|||
|
|||
/// <summary>
|
|||
/// Position this tick at the bottom of target element.
|
|||
/// </summary>
|
|||
Bottom, |
|||
|
|||
// NOTE: if you add or remove any values in this enum, be sure to update TickBar.IsValidTickBarPlacement()
|
|||
} |
|||
|
|||
/// <summary>
|
|||
/// TickBar is an element that use for drawing Slider's Ticks.
|
|||
/// </summary>
|
|||
public class TickBar : Control |
|||
{ |
|||
static TickBar() |
|||
{ |
|||
AffectsRender<TickBar>(ReservedSpaceProperty, |
|||
MaximumProperty, |
|||
MinimumProperty, |
|||
OrientationProperty, |
|||
TickFrequencyProperty); |
|||
} |
|||
|
|||
public TickBar() : base() |
|||
{ |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Defines the <see cref="Fill"/> property.
|
|||
/// </summary>
|
|||
public static readonly StyledProperty<IBrush> FillProperty = |
|||
AvaloniaProperty.Register<TickBar, IBrush>(nameof(Fill)); |
|||
|
|||
/// <summary>
|
|||
/// Brush used to fill the TickBar's Ticks.
|
|||
/// </summary>
|
|||
public IBrush Fill |
|||
{ |
|||
get { return GetValue(FillProperty); } |
|||
set { SetValue(FillProperty, value); } |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Defines the <see cref="Minimum"/> property.
|
|||
/// </summary>
|
|||
public static readonly StyledProperty<double> MinimumProperty = |
|||
AvaloniaProperty.Register<TickBar, double>(nameof(Minimum), 0d); |
|||
|
|||
/// <summary>
|
|||
/// Logical position where the Minimum Tick will be drawn
|
|||
/// </summary>
|
|||
public double Minimum |
|||
{ |
|||
get { return GetValue(MinimumProperty); } |
|||
set |
|||
{ |
|||
SetValue(MinimumProperty, value); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Defines the <see cref="Maximum"/> property.
|
|||
/// </summary>
|
|||
public static readonly StyledProperty<double> MaximumProperty = |
|||
AvaloniaProperty.Register<TickBar, double>(nameof(Maximum), 0d); |
|||
|
|||
/// <summary>
|
|||
/// Logical position where the Maximum Tick will be drawn
|
|||
/// </summary>
|
|||
public double Maximum |
|||
{ |
|||
get { return GetValue(MaximumProperty); } |
|||
set { SetValue(MaximumProperty, value); } |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Defines the <see cref="TickFrequency"/> property.
|
|||
/// </summary>
|
|||
public static readonly StyledProperty<double> TickFrequencyProperty = |
|||
AvaloniaProperty.Register<TickBar, double>(nameof(TickFrequency), 0d); |
|||
|
|||
/// <summary>
|
|||
/// TickFrequency property defines how the tick will be drawn.
|
|||
/// </summary>
|
|||
public double TickFrequency |
|||
{ |
|||
get { return GetValue(TickFrequencyProperty); } |
|||
set { SetValue(TickFrequencyProperty, value); } |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Defines the <see cref="Orientation"/> property.
|
|||
/// </summary>
|
|||
public static readonly StyledProperty<Orientation> OrientationProperty = |
|||
AvaloniaProperty.Register<TickBar, Orientation>(nameof(Orientation)); |
|||
|
|||
/// <summary>
|
|||
/// TickBar parent's orientation.
|
|||
/// </summary>
|
|||
public Orientation Orientation |
|||
{ |
|||
get { return GetValue(OrientationProperty); } |
|||
set { SetValue(OrientationProperty, value); } |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Defines the <see cref="Ticks"/> property.
|
|||
/// </summary>
|
|||
public static readonly StyledProperty<List<double>> TicksProperty = |
|||
AvaloniaProperty.Register<TickBar, List<double>>(nameof(Ticks)); |
|||
|
|||
/// <summary>
|
|||
/// The Ticks property contains collection of value of type Double which
|
|||
/// are the logical positions use to draw the ticks.
|
|||
/// The property value is a <see cref="DoubleCollection" />.
|
|||
/// </summary>
|
|||
public List<double> Ticks |
|||
{ |
|||
get { return GetValue(TicksProperty); } |
|||
set { SetValue(TicksProperty, value); } |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Defines the <see cref="IsDirectionReversed"/> property.
|
|||
/// </summary>
|
|||
public static readonly StyledProperty<bool> IsDirectionReversedProperty = |
|||
AvaloniaProperty.Register<TickBar, bool>(nameof(IsDirectionReversed), false); |
|||
|
|||
/// <summary>
|
|||
/// The IsDirectionReversed property defines the direction of value incrementation.
|
|||
/// By default, if Tick's orientation is Horizontal, ticks will be drawn from left to right.
|
|||
/// (And, bottom to top for Vertical orientation).
|
|||
/// If IsDirectionReversed is 'true' the direction of the drawing will be in opposite direction.
|
|||
/// </summary>
|
|||
public bool IsDirectionReversed |
|||
{ |
|||
get { return GetValue(IsDirectionReversedProperty); } |
|||
set { SetValue(IsDirectionReversedProperty, value); } |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Defines the <see cref="Placement"/> property.
|
|||
/// </summary>
|
|||
public static readonly StyledProperty<TickBarPlacement> PlacementProperty = |
|||
AvaloniaProperty.Register<TickBar, TickBarPlacement>(nameof(Placement), 0d); |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Placement property specified how the Tick will be placed.
|
|||
/// This property affects the way ticks are drawn.
|
|||
/// This property has type of <see cref="TickBarPlacement" />.
|
|||
/// </summary>
|
|||
public TickBarPlacement Placement |
|||
{ |
|||
get { return GetValue(PlacementProperty); } |
|||
set { SetValue(PlacementProperty, value); } |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Defines the <see cref="ReservedSpace"/> property.
|
|||
/// </summary>
|
|||
public static readonly StyledProperty<Rect> ReservedSpaceProperty = |
|||
AvaloniaProperty.Register<TickBar, Rect>(nameof(ReservedSpace)); |
|||
|
|||
/// <summary>
|
|||
/// TickBar will use ReservedSpaceProperty for left and right spacing (for horizontal orientation) or
|
|||
/// tob and bottom spacing (for vertical orienation).
|
|||
/// The space on both sides of TickBar is half of specified ReservedSpace.
|
|||
/// This property has type of <see cref="Rect" />.
|
|||
/// </summary>
|
|||
public Rect ReservedSpace |
|||
{ |
|||
get { return GetValue(ReservedSpaceProperty); } |
|||
set { SetValue(ReservedSpaceProperty, value); } |
|||
} |
|||
|
|||
protected override void OnPropertyChanged<T>(AvaloniaPropertyChangedEventArgs<T> change) |
|||
{ |
|||
base.OnPropertyChanged(change); |
|||
|
|||
if (change.Property == ReservedSpaceProperty) |
|||
{ |
|||
// UpdatePseudoClasses(change.NewValue.GetValueOrDefault<Location>());
|
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Draw ticks.
|
|||
/// Ticks can be draw in 8 diffrent ways depends on Placment property and IsDirectionReversed property.
|
|||
///
|
|||
/// This function also draw selection-tick(s) if IsSelectionRangeEnabled is 'true' and
|
|||
/// SelectionStart and SelectionEnd are valid.
|
|||
///
|
|||
/// The primary ticks (for Mininum and Maximum value) height will be 100% of TickBar's render size (use Width or Height
|
|||
/// depends on Placement property).
|
|||
///
|
|||
/// The secondary ticks (all other ticks, including selection-tics) height will be 75% of TickBar's render size.
|
|||
///
|
|||
/// Brush that use to fill ticks is specified by Shape.Fill property.
|
|||
///
|
|||
/// Pen that use to draw ticks is specified by Shape.Pen property.
|
|||
/// </summary>
|
|||
public override void Render(DrawingContext dc) |
|||
{ |
|||
var size = new Size(Bounds.Width, Bounds.Height); |
|||
var range = Maximum - Minimum; |
|||
var tickLen = 0.0d; // Height for Primary Tick (for Mininum and Maximum value)
|
|||
var tickLen2 = 0.0d; // Height for Secondary Tick
|
|||
var logicalToPhysical = 1.0; |
|||
var progression = 1.0d; |
|||
var startPoint = new Point(); |
|||
var endPoint = new Point(); |
|||
var rSpace = Orientation == Orientation.Horizontal ? ReservedSpace.Width : ReservedSpace.Height; |
|||
|
|||
// Take Thumb size in to account
|
|||
double halfReservedSpace = rSpace * 0.5; |
|||
|
|||
switch (Placement) |
|||
{ |
|||
case TickBarPlacement.Top: |
|||
if (MathUtilities.GreaterThanOrClose(rSpace, size.Width)) |
|||
{ |
|||
return; |
|||
} |
|||
size = new Size(size.Width - rSpace, size.Height); |
|||
tickLen = -size.Height; |
|||
startPoint = new Point(halfReservedSpace, size.Height); |
|||
endPoint = new Point(halfReservedSpace + size.Width, size.Height); |
|||
logicalToPhysical = size.Width / range; |
|||
progression = 1; |
|||
break; |
|||
|
|||
case TickBarPlacement.Bottom: |
|||
if (MathUtilities.GreaterThanOrClose(rSpace, size.Width)) |
|||
{ |
|||
return; |
|||
} |
|||
size = new Size(size.Width - rSpace, size.Height); |
|||
tickLen = size.Height; |
|||
startPoint = new Point(halfReservedSpace, 0d); |
|||
endPoint = new Point(halfReservedSpace + size.Width, 0d); |
|||
logicalToPhysical = size.Width / range; |
|||
progression = 1; |
|||
break; |
|||
|
|||
case TickBarPlacement.Left: |
|||
if (MathUtilities.GreaterThanOrClose(rSpace, size.Height)) |
|||
{ |
|||
return; |
|||
} |
|||
size = new Size(size.Width, size.Height - rSpace); |
|||
|
|||
tickLen = -size.Width; |
|||
startPoint = new Point(size.Width, size.Height + halfReservedSpace); |
|||
endPoint = new Point(size.Width, halfReservedSpace); |
|||
logicalToPhysical = size.Height / range * -1; |
|||
progression = -1; |
|||
break; |
|||
|
|||
case TickBarPlacement.Right: |
|||
if (MathUtilities.GreaterThanOrClose(rSpace, size.Height)) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
size = new Size(size.Width, size.Height - rSpace); |
|||
|
|||
tickLen = size.Width; |
|||
startPoint = new Point(0d, size.Height + halfReservedSpace); |
|||
endPoint = new Point(0d, halfReservedSpace); |
|||
logicalToPhysical = size.Height / range * -1; |
|||
progression = -1; |
|||
break; |
|||
}; |
|||
|
|||
tickLen2 = tickLen * 0.75; |
|||
|
|||
// Invert direciton of the ticks
|
|||
if (IsDirectionReversed) |
|||
{ |
|||
progression *= -progression; |
|||
logicalToPhysical *= -1; |
|||
|
|||
// swap startPoint & endPoint
|
|||
var pt = startPoint; |
|||
startPoint = endPoint; |
|||
endPoint = pt; |
|||
} |
|||
|
|||
var pen = new Pen(Fill, 1.0d); |
|||
|
|||
// Is it Vertical?
|
|||
if ((Placement == TickBarPlacement.Left) || (Placement == TickBarPlacement.Right)) |
|||
{ |
|||
// Reduce tick interval if it is more than would be visible on the screen
|
|||
double interval = TickFrequency; |
|||
if (interval > 0.0) |
|||
{ |
|||
double minInterval = (Maximum - Minimum) / size.Height; |
|||
if (interval < minInterval) |
|||
{ |
|||
interval = minInterval; |
|||
} |
|||
} |
|||
|
|||
// Draw Min & Max tick
|
|||
dc.DrawLine(pen, startPoint, new Point(startPoint.X + tickLen, startPoint.Y)); |
|||
dc.DrawLine(pen, new Point(startPoint.X, endPoint.Y), |
|||
new Point(startPoint.X + tickLen, endPoint.Y)); |
|||
|
|||
// This property is rarely set so let's try to avoid the GetValue
|
|||
// caching of the mutable default value
|
|||
var ticks = Ticks ?? null; |
|||
|
|||
// Draw ticks using specified Ticks collection
|
|||
if (ticks?.Count > 0) |
|||
{ |
|||
for (int i = 0; i < ticks.Count; i++) |
|||
{ |
|||
if (MathUtilities.LessThanOrClose(ticks[i], Minimum) || MathUtilities.GreaterThanOrClose(ticks[i], Maximum)) |
|||
{ |
|||
continue; |
|||
} |
|||
|
|||
double adjustedTick = ticks[i] - Minimum; |
|||
|
|||
double y = adjustedTick * logicalToPhysical + startPoint.Y; |
|||
dc.DrawLine(pen, |
|||
new Point(startPoint.X, y), |
|||
new Point(startPoint.X + tickLen2, y)); |
|||
} |
|||
} |
|||
// Draw ticks using specified TickFrequency
|
|||
else if (interval > 0.0) |
|||
{ |
|||
for (double i = interval; i < range; i += interval) |
|||
{ |
|||
double y = i * logicalToPhysical + startPoint.Y; |
|||
|
|||
dc.DrawLine(pen, |
|||
new Point(startPoint.X, y), |
|||
new Point(startPoint.X + tickLen2, y)); |
|||
} |
|||
} |
|||
} |
|||
else // Placement == Top || Placement == Bottom
|
|||
{ |
|||
// Reduce tick interval if it is more than would be visible on the screen
|
|||
double interval = TickFrequency; |
|||
if (interval > 0.0) |
|||
{ |
|||
double minInterval = (Maximum - Minimum) / size.Width; |
|||
if (interval < minInterval) |
|||
{ |
|||
interval = minInterval; |
|||
} |
|||
} |
|||
|
|||
// Draw Min & Max tick
|
|||
dc.DrawLine(pen, startPoint, new Point(startPoint.X, startPoint.Y + tickLen)); |
|||
dc.DrawLine(pen, new Point(endPoint.X, startPoint.Y), |
|||
new Point(endPoint.X, startPoint.Y + tickLen)); |
|||
|
|||
// This property is rarely set so let's try to avoid the GetValue
|
|||
// caching of the mutable default value
|
|||
var ticks = Ticks ?? null; |
|||
|
|||
// Draw ticks using specified Ticks collection
|
|||
if (ticks?.Count > 0) |
|||
{ |
|||
for (int i = 0; i < ticks.Count; i++) |
|||
{ |
|||
if (MathUtilities.LessThanOrClose(ticks[i], Minimum) || MathUtilities.GreaterThanOrClose(ticks[i], Maximum)) |
|||
{ |
|||
continue; |
|||
} |
|||
double adjustedTick = ticks[i] - Minimum; |
|||
|
|||
double x = adjustedTick * logicalToPhysical + startPoint.X; |
|||
dc.DrawLine(pen, |
|||
new Point(x, startPoint.Y), |
|||
new Point(x, startPoint.Y + tickLen2)); |
|||
} |
|||
} |
|||
// Draw ticks using specified TickFrequency
|
|||
else if (interval > 0.0) |
|||
{ |
|||
for (double i = interval; i < range; i += interval) |
|||
{ |
|||
double x = i * logicalToPhysical + startPoint.X; |
|||
dc.DrawLine(pen, |
|||
new Point(x, startPoint.Y), |
|||
new Point(x, startPoint.Y + tickLen2)); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -1,93 +1,252 @@ |
|||
<Styles xmlns="https://github.com/avaloniaui"> |
|||
<Styles xmlns="https://github.com/avaloniaui" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> |
|||
<Design.PreviewWith> |
|||
<Border Margin="20" Width="200" Height="200"> |
|||
<DockPanel LastChildFill="True"> |
|||
<StackPanel Spacing="10" DockPanel.Dock="Top"> |
|||
<Slider Value="50" /> |
|||
<Slider IsEnabled="False" Value="50" /> |
|||
</StackPanel> |
|||
<StackPanel Spacing="10" Orientation="Horizontal"> |
|||
<Slider Value="50" Orientation="Vertical" /> |
|||
<Slider IsEnabled="False" Orientation="Vertical" Value="50" /> |
|||
</StackPanel> |
|||
</DockPanel> |
|||
</Border> |
|||
</Design.PreviewWith> |
|||
<Styles.Resources> |
|||
<Thickness x:Key="SliderTopHeaderMargin">0,0,0,4</Thickness> |
|||
<GridLength x:Key="SliderPreContentMargin">15</GridLength> |
|||
<GridLength x:Key="SliderPostContentMargin">15</GridLength> |
|||
<x:Double x:Key="SliderHorizontalHeight">32</x:Double> |
|||
<x:Double x:Key="SliderVerticalWidth">32</x:Double> |
|||
<CornerRadius x:Key="SliderThumbCornerRadius">10</CornerRadius> |
|||
<x:Double x:Key="SliderHorizontalThumbWidth">20</x:Double> |
|||
<x:Double x:Key="SliderHorizontalThumbHeight">20</x:Double> |
|||
<x:Double x:Key="SliderVerticalThumbWidth">20</x:Double> |
|||
<x:Double x:Key="SliderVerticalThumbHeight">20</x:Double> |
|||
</Styles.Resources> |
|||
|
|||
<Style Selector="Thumb.SliderThumbStyle"> |
|||
<Setter Property="BorderThickness" Value="0" /> |
|||
<Setter Property="Template"> |
|||
<Setter.Value> |
|||
<ControlTemplate> |
|||
<Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="{DynamicResource SliderThumbCornerRadius}" /> |
|||
</ControlTemplate> |
|||
</Setter.Value> |
|||
</Setter> |
|||
</Style> |
|||
|
|||
<Style Selector="Slider:horizontal"> |
|||
<Setter Property="MinWidth" Value="40"/> |
|||
<Setter Property="MinHeight" Value="20"/> |
|||
<Setter Property="Background" Value="{DynamicResource SliderTrackFill}" /> |
|||
<Setter Property="BorderThickness" Value="{DynamicResource SliderBorderThemeThickness}" /> |
|||
<Setter Property="Foreground" Value="{DynamicResource SliderTrackValueFill}" /> |
|||
<Setter Property="FontFamily" Value="{DynamicResource ContentControlThemeFontFamily}" /> |
|||
<Setter Property="FontSize" Value="{DynamicResource ControlContentThemeFontSize}" /> |
|||
<Setter Property="Template"> |
|||
<ControlTemplate> |
|||
<Grid Name="grid"> |
|||
<Grid.RowDefinitions> |
|||
<RowDefinition Height="Auto"/> |
|||
<RowDefinition Height="Auto" MinHeight="20"/> |
|||
<RowDefinition Height="Auto"/> |
|||
</Grid.RowDefinitions> |
|||
<Border Name="TrackBackground" Grid.Row="1" Height="4" Margin="6,0" VerticalAlignment="Center"/> |
|||
<Track Name="PART_Track" Grid.Row="1" Orientation="Horizontal"> |
|||
<Track.DecreaseButton> |
|||
<RepeatButton Name="PART_DecreaseButton" |
|||
Classes="repeattrack" /> |
|||
</Track.DecreaseButton> |
|||
<Track.IncreaseButton> |
|||
<RepeatButton Name="PART_IncreaseButton" |
|||
Classes="repeattrack" /> |
|||
</Track.IncreaseButton> |
|||
<Thumb Name="thumb" MinWidth="20" MinHeight="20"> |
|||
<Thumb.Template> |
|||
<ControlTemplate> |
|||
<Grid> |
|||
<Ellipse Width="12" Height="12" Fill="{DynamicResource ThemeAccentBrush}"/> |
|||
</Grid> |
|||
</ControlTemplate> |
|||
</Thumb.Template> |
|||
</Thumb> |
|||
</Track> |
|||
</Grid> |
|||
<Border BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" CornerRadius="{DynamicResource ControlCornerRadius}"> |
|||
<Grid Name="grid" Margin="{TemplateBinding Padding}" RowDefinitions="Auto, *"> |
|||
<ContentPresenter x:Name="HeaderContentPresenter" Grid.Row="0" TextBlock.FontWeight="{DynamicResource SliderHeaderThemeFontWeight}" TextBlock.Foreground="{DynamicResource SliderHeaderForeground}" Margin="{DynamicResource SliderTopHeaderMargin}" /> |
|||
<Grid x:Name="SliderContainer" Grid.Row="1"> |
|||
<Grid.Styles> |
|||
<Style Selector="TickBar"> |
|||
<Setter Property="ReservedSpace" Value="{Binding #PART_Track.Thumb.Bounds}" /> |
|||
</Style> |
|||
</Grid.Styles> |
|||
<Grid x:Name="HorizontalTemplate" ColumnDefinitions="Auto,Auto,*" MinHeight="{DynamicResource SliderHorizontalHeight}"> |
|||
<Grid.RowDefinitions> |
|||
<RowDefinition Height="{DynamicResource SliderPreContentMargin}" /> |
|||
<RowDefinition Height="Auto" /> |
|||
<RowDefinition Height="{DynamicResource SliderPostContentMargin}" /> |
|||
</Grid.RowDefinitions> |
|||
|
|||
<TickBar Name="TopTickBar" Placement="Top" Height="{DynamicResource SliderOutsideTickBarThemeHeight}" VerticalAlignment="Bottom" Margin="0,0,0,4" Grid.ColumnSpan="3" /> |
|||
|
|||
<!-- <TickBar Name="HorizontalInlineTickBar" Placement="Top" Fill="{DynamicResource SliderInlineTickBarFill}" Height="{DynamicResource SliderTrackThemeHeight}" Grid.Row="1" Grid.ColumnSpan="3" /> --> |
|||
|
|||
<TickBar Name="BottomTickBar" Placement="Bottom" Height="{DynamicResource SliderOutsideTickBarThemeHeight}" VerticalAlignment="Top" Margin="0,4,0,0" Grid.Row="2" Grid.ColumnSpan="3" /> |
|||
|
|||
<Track Name="PART_Track" Grid.Row="1" Grid.ColumnSpan="3" Orientation="Horizontal"> |
|||
<Track.DecreaseButton> |
|||
<RepeatButton Name="PART_DecreaseButton" Background="{TemplateBinding Foreground}"> |
|||
<RepeatButton.Template> |
|||
<ControlTemplate> |
|||
<Grid> |
|||
<Border Name="FocusTarget" Background="Transparent" Margin="0,-10"/> |
|||
<Border Name="TrackBackground" Background="{TemplateBinding Background}" CornerRadius="{DynamicResource ControlCornerRadius}" Height="{DynamicResource SliderTrackThemeHeight}" VerticalAlignment="Center"/> |
|||
</Grid> |
|||
</ControlTemplate> |
|||
</RepeatButton.Template> |
|||
</RepeatButton> |
|||
</Track.DecreaseButton> |
|||
<Track.IncreaseButton> |
|||
<RepeatButton Name="PART_IncreaseButton" Background="{TemplateBinding Background}"> |
|||
<RepeatButton.Template> |
|||
<ControlTemplate> |
|||
<Grid> |
|||
<Border Name="FocusTarget" Background="Transparent" Margin="0,-10"/> |
|||
<Border Name="TrackBackground" Background="{TemplateBinding Background}" CornerRadius="{DynamicResource ControlCornerRadius}" Height="{DynamicResource SliderTrackThemeHeight}" VerticalAlignment="Center"/> |
|||
</Grid> |
|||
</ControlTemplate> |
|||
</RepeatButton.Template> |
|||
</RepeatButton> |
|||
</Track.IncreaseButton> |
|||
<Thumb Classes="SliderThumbStyle" Name="thumb" Margin="0" Padding="0" DataContext="{TemplateBinding Value}" Height="{DynamicResource SliderHorizontalThumbHeight}" Width="{DynamicResource SliderHorizontalThumbWidth}" /> |
|||
</Track> |
|||
</Grid> |
|||
</Grid> |
|||
</Grid> |
|||
</Border> |
|||
</ControlTemplate> |
|||
</Setter> |
|||
</Style> |
|||
|
|||
<Style Selector="Slider:vertical"> |
|||
<Setter Property="MinWidth" Value="20"/> |
|||
<Setter Property="MinHeight" Value="40"/> |
|||
<Setter Property="Background" Value="{DynamicResource SliderTrackFill}" /> |
|||
<Setter Property="BorderThickness" Value="{DynamicResource SliderBorderThemeThickness}" /> |
|||
<Setter Property="Foreground" Value="{DynamicResource SliderTrackValueFill}" /> |
|||
<Setter Property="FontFamily" Value="{DynamicResource ContentControlThemeFontFamily}" /> |
|||
<Setter Property="FontSize" Value="{DynamicResource ControlContentThemeFontSize}" /> |
|||
<Setter Property="Template"> |
|||
<ControlTemplate> |
|||
<Grid> |
|||
<Grid.ColumnDefinitions> |
|||
<ColumnDefinition Width="Auto"/> |
|||
<ColumnDefinition Width="Auto" MinWidth="26"/> |
|||
<ColumnDefinition Width="Auto"/> |
|||
</Grid.ColumnDefinitions> |
|||
<Border Name="TrackBackground" Grid.Column="1" Width="4" Margin="0,6" HorizontalAlignment="Center"/> |
|||
<Track Name="PART_Track" Grid.Column="1" Orientation="Vertical" IsDirectionReversed="True"> |
|||
<Track.DecreaseButton> |
|||
<RepeatButton Name="PART_DecreaseButton" |
|||
Classes="repeattrack" /> |
|||
</Track.DecreaseButton> |
|||
<Track.IncreaseButton> |
|||
<RepeatButton Name="PART_IncreaseButton" |
|||
Classes="repeattrack" /> |
|||
</Track.IncreaseButton> |
|||
<Thumb Name="thumb" MinWidth="20" MinHeight="20"> |
|||
<Thumb.Template> |
|||
<ControlTemplate> |
|||
<Grid> |
|||
<Ellipse Width="12" Height="12" Fill="{DynamicResource ThemeAccentBrush}"/> |
|||
</Grid> |
|||
</ControlTemplate> |
|||
</Thumb.Template> |
|||
</Thumb> |
|||
</Track> |
|||
</Grid> |
|||
<Border BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" CornerRadius="{DynamicResource ControlCornerRadius}"> |
|||
<Grid Name="grid" Margin="{TemplateBinding Padding}" RowDefinitions="Auto, *"> |
|||
<ContentPresenter x:Name="HeaderContentPresenter" Grid.Row="0" TextBlock.FontWeight="{DynamicResource SliderHeaderThemeFontWeight}" TextBlock.Foreground="{DynamicResource SliderHeaderForeground}" Margin="{DynamicResource SliderTopHeaderMargin}" /> |
|||
<Grid x:Name="SliderContainer" Grid.Row="1"> |
|||
<Grid.Styles> |
|||
<Style Selector="TickBar"> |
|||
<Setter Property="ReservedSpace" Value="{Binding #PART_Track.Thumb.Bounds}" /> |
|||
</Style> |
|||
</Grid.Styles> |
|||
<Grid x:Name="VerticalTemplate" RowDefinitions="*,Auto,Auto" MinWidth="{DynamicResource SliderVerticalWidth}"> |
|||
<Grid.ColumnDefinitions> |
|||
<ColumnDefinition Width="{DynamicResource SliderPreContentMargin}" /> |
|||
<ColumnDefinition Width="Auto" /> |
|||
<ColumnDefinition Width="{DynamicResource SliderPostContentMargin}" /> |
|||
</Grid.ColumnDefinitions> |
|||
|
|||
<TickBar Name="LeftTickBar" Placement="Left" Width="{DynamicResource SliderOutsideTickBarThemeHeight}" HorizontalAlignment="Right" Margin="0,0,4,0" Grid.RowSpan="3" /> |
|||
|
|||
<!-- <TickBar Name="VerticalInlineTickBar" Placement="Left" Fill="{DynamicResource SliderInlineTickBarFill}" Width="{DynamicResource SliderTrackThemeHeight}" Grid.Column="1" Grid.RowSpan="3" /> --> |
|||
|
|||
<TickBar Name="RightTickBar" Placement="Right" Width="{DynamicResource SliderOutsideTickBarThemeHeight}" HorizontalAlignment="Left" Margin="4,0,0,0" Grid.Column="2" Grid.RowSpan="3" /> |
|||
|
|||
<Track Name="PART_Track" Grid.Column="1" Grid.ColumnSpan="1" Grid.RowSpan="3" Orientation="Vertical"> |
|||
<Track.DecreaseButton> |
|||
<RepeatButton Name="PART_DecreaseButton" Background="{TemplateBinding Foreground}"> |
|||
<RepeatButton.Template> |
|||
<ControlTemplate> |
|||
<Grid> |
|||
<Border Name="FocusTarget" Background="Transparent" Margin="0,-10"/> |
|||
<Border Name="TrackBackground" Background="{TemplateBinding Background}" CornerRadius="{DynamicResource ControlCornerRadius}" Width="{DynamicResource SliderTrackThemeHeight}" HorizontalAlignment="Center"/> |
|||
</Grid> |
|||
</ControlTemplate> |
|||
</RepeatButton.Template> |
|||
</RepeatButton> |
|||
</Track.DecreaseButton> |
|||
<Track.IncreaseButton> |
|||
<RepeatButton Name="PART_IncreaseButton" Background="{TemplateBinding Background}"> |
|||
<RepeatButton.Template> |
|||
<ControlTemplate> |
|||
<Grid> |
|||
<Border Name="FocusTarget" Background="Transparent" Margin="0,-10"/> |
|||
<Border Name="TrackBackground" Background="{TemplateBinding Background}" CornerRadius="{DynamicResource ControlCornerRadius}" Width="{DynamicResource SliderTrackThemeHeight}" HorizontalAlignment="Center"/> |
|||
</Grid> |
|||
</ControlTemplate> |
|||
</RepeatButton.Template> |
|||
</RepeatButton> |
|||
</Track.IncreaseButton> |
|||
<Thumb Classes="SliderThumbStyle" Name="SliderThumb" Margin="0" Padding="0" DataContext="{TemplateBinding Value}" Height="{DynamicResource SliderVerticalThumbHeight}" Width="{DynamicResource SliderVerticalThumbWidth}" /> |
|||
</Track> |
|||
</Grid> |
|||
</Grid> |
|||
</Grid> |
|||
</Border> |
|||
</ControlTemplate> |
|||
</Setter> |
|||
</Style> |
|||
|
|||
<Style Selector="Slider /template/ Track#PART_Track"> |
|||
<Setter Property="Minimum" Value="{TemplateBinding Minimum}"/> |
|||
<Setter Property="Maximum" Value="{TemplateBinding Maximum}"/> |
|||
<Setter Property="Value" Value="{TemplateBinding Value, Mode=TwoWay}"/> |
|||
</Style> |
|||
<Style Selector="Slider /template/ Border#TrackBackground"> |
|||
<Setter Property="BorderThickness" Value="2"/> |
|||
<Setter Property="BorderBrush" Value="{DynamicResource ThemeBorderLowBrush}"/> |
|||
|
|||
<Style Selector="Slider /template/ TickBar"> |
|||
<Setter Property="Fill" Value="{DynamicResource SliderTickBarFill}" /> |
|||
<Setter Property="TickFrequency" Value="{TemplateBinding Slider.TickFrequency}" /> |
|||
<Setter Property="Orientation" Value="{TemplateBinding Slider.Orientation}" /> |
|||
<Setter Property="Minimum" Value="{TemplateBinding Slider.Minimum}" /> |
|||
<Setter Property="Maximum" Value="{TemplateBinding Slider.Maximum}" /> |
|||
</Style> |
|||
<Style Selector="Slider /template/ RepeatButton.repeattrack"> |
|||
<Setter Property="Background" Value="Transparent"/> |
|||
<Setter Property="Foreground" Value="{DynamicResource ThemeBorderLowBrush}"/> |
|||
<Setter Property="Template"> |
|||
<ControlTemplate> |
|||
<Border Background="{TemplateBinding Background}" /> |
|||
</ControlTemplate> |
|||
</Setter> |
|||
|
|||
<!-- Normal State --> |
|||
<Style Selector="Slider /template/ Thumb.SliderThumbStyle"> |
|||
<Setter Property="Background" Value="{DynamicResource SliderThumbBackground}" /> |
|||
</Style> |
|||
|
|||
<Style Selector="Slider /template/ Grid#SliderContainer"> |
|||
<Setter Property="Background" Value="{DynamicResource SliderContainerBackground}" /> |
|||
</Style> |
|||
|
|||
<!-- Disabled State --> |
|||
<Style Selector="Slider:disabled /template/ ContentPresenter#HeaderContentPresenter"> |
|||
<Setter Property="TextBlock.Foreground" Value="{DynamicResource SliderHeaderForegroundDisabled}" /> |
|||
</Style> |
|||
|
|||
<Style Selector="Slider:disabled /template/ RepeatButton#PART_DecreaseButton"> |
|||
<Setter Property="Background" Value="{DynamicResource SliderTrackValueFillDisabled}" /> |
|||
</Style> |
|||
|
|||
<Style Selector="Slider:disabled /template/ RepeatButton#PART_IncreaseButton"> |
|||
<Setter Property="Background" Value="{DynamicResource SliderTrackFillDisabled}" /> |
|||
</Style> |
|||
|
|||
<Style Selector="Slider:disabled /template/ Thumb.SliderThumbStyle"> |
|||
<Setter Property="Background" Value="{DynamicResource SliderThumbBackgroundDisabled}" /> |
|||
</Style> |
|||
|
|||
<Style Selector="Slider:disabled /template/ TickBar"> |
|||
<Setter Property="Fill" Value="{DynamicResource SliderTickBarFillDisabled}" /> |
|||
</Style> |
|||
|
|||
<Style Selector="Slider:pointerover /template/ Grid#SliderContainer"> |
|||
<Setter Property="Background" Value="{DynamicResource SliderContainerBackgroundDisabled}" /> |
|||
</Style> |
|||
|
|||
<!-- PointerOver State --> |
|||
<Style Selector="Slider:pointerover /template/ RepeatButton#PART_IncreaseButton"> |
|||
<Setter Property="Background" Value="{DynamicResource SliderTrackFillPointerOver}" /> |
|||
</Style> |
|||
|
|||
<Style Selector="Slider:pointerover /template/ Thumb.SliderThumbStyle"> |
|||
<Setter Property="Background" Value="{DynamicResource SliderThumbBackgroundPointerOver}" /> |
|||
</Style> |
|||
|
|||
<Style Selector="Slider:pointerover /template/ Grid#SliderContainer"> |
|||
<Setter Property="Background" Value="{DynamicResource SliderContainerBackgroundPointerOver}" /> |
|||
</Style> |
|||
|
|||
<Style Selector="Slider:pointerover /template/ RepeatButton#PART_DecreaseButton"> |
|||
<Setter Property="Background" Value="{DynamicResource SliderTrackValueFillPointerOver}" /> |
|||
</Style> |
|||
|
|||
<!-- Pressed State --> |
|||
<Style Selector="Slider:pressed /template/ RepeatButton#PART_IncreaseButton"> |
|||
<Setter Property="Background" Value="{DynamicResource SliderTrackFillPressed}" /> |
|||
</Style> |
|||
|
|||
<Style Selector="Slider:pressed /template/ Thumb.SliderThumbStyle"> |
|||
<Setter Property="Background" Value="{DynamicResource SliderThumbBackgroundPressed}" /> |
|||
</Style> |
|||
|
|||
<Style Selector="Slider:pointerover /template/ Grid#SliderContainer"> |
|||
<Setter Property="Background" Value="{DynamicResource SliderContainerBackgroundPressed}" /> |
|||
</Style> |
|||
|
|||
<Style Selector="Slider:pointerover /template/ RepeatButton#PART_DecreaseButton"> |
|||
<Setter Property="Background" Value="{DynamicResource SliderTrackValueFillPressed}" /> |
|||
</Style> |
|||
<Style Selector="Slider:disabled /template/ Grid#grid"> |
|||
<Setter Property="Opacity" Value="{DynamicResource ThemeDisabledOpacity}" /> |
|||
</Style> |
|||
</Styles> |
|||
|
|||
Loading…
Reference in new issue