양쪽으로 조절가능한 slider
DualThumbSlider.xaml
<UserControl x:Class="Test.DualThumbSlider"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="root"
>
<UserControl.Resources>
<ControlTemplate x:Key="simpleSlider" TargetType="{x:Type Slider}">
<Border SnapsToDevicePixels="true"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto" MinHeight="{TemplateBinding MinHeight}"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Rectangle x:Name="PART_SelectionRange"/>
<Track x:Name="PART_Track" Grid.Row="1">
<Track.Thumb>
<Thumb x:Name="Thumb">
<Thumb.Template>
<ControlTemplate TargetType="Thumb">
<Border CornerRadius="1" BorderThickness="1" BorderBrush="{DynamicResource State.AHRSClick}" Width="10"
Height="18"
SnapsToDevicePixels="True" Background="#FF7F00">
</Border>
</ControlTemplate>
</Thumb.Template>
</Thumb>
</Track.Thumb>
</Track>
</Grid>
</Border>
</ControlTemplate>
</UserControl.Resources>
<StackPanel>
<Grid VerticalAlignment="Top">
<Border BorderThickness="1"
BorderBrush="{DynamicResource Background.5}"
Background="{DynamicResource Background.5}"
VerticalAlignment="Center"
Height="4"
Margin="10,0,10,0"/>
<Slider x:Name="LowerSlider"
Minimum="{Binding ElementName=root, Path=Minimum}"
Maximum="{Binding ElementName=root, Path=Maximum}"
Value="{Binding ElementName=root, Path=LowerValue}"
Template="{DynamicResource simpleSlider}"
Margin="0,0,10,0"
/>
<Slider x:Name="UpperSlider"
Minimum="{Binding ElementName=root, Path=Minimum}"
Maximum="{Binding ElementName=root, Path=Maximum}"
Value="{Binding ElementName=root, Path=UpperValue}"
Template="{DynamicResource simpleSlider}"
Margin="10,0,0,0"
>
</Slider>
</Grid>
</StackPanel>
</UserControl>
DualThumbSlider.xaml.cs
using System;
using System.Windows;
using System.Windows.Controls;
namespace Test
{
/// <summary>
/// DualThumbSlider.xaml에 대한 상호 작용 논리
/// </summary>
public partial class DualThumbSlider : UserControl
{
public DualThumbSlider()
{
InitializeComponent();
this.Loaded += RangeSlider_Loaded;
}
public void SetLsliderValue(double val)
{
LowerSlider.Dispatcher.Invoke(() =>
{
LowerSlider.Value = val;
});
}
public void SetUsliderValue(double val)
{
UpperSlider.Dispatcher.Invoke(() =>
{
UpperSlider.Value = val;
});
}
public void SetLsliderMin(double val)
{
LowerSlider.Dispatcher.Invoke(() =>
{
LowerSlider.Minimum = val;
});
}
public void SetUsliderMin(double val)
{
UpperSlider.Dispatcher.Invoke(() =>
{
UpperSlider.Minimum = val;
});
}
public void SetLsliderMax(double val)
{
LowerSlider.Dispatcher.Invoke(() =>
{
LowerSlider.Maximum = val;
});
}
public void SetUsliderMax(double val)
{
UpperSlider.Dispatcher.Invoke(() =>
{
UpperSlider.Maximum = val;
});
}
void RangeSlider_Loaded(object sender, RoutedEventArgs e)
{
LowerSlider.ValueChanged += LowerSlider_ValueChanged;
UpperSlider.ValueChanged += UpperSlider_ValueChanged;
}
public double Minimum
{
get { return (double)GetValue(MinimumProperty); }
set { SetValue(MinimumProperty, value); }
}
//바인딩
public static readonly DependencyProperty MinimumProperty =
DependencyProperty.Register("Minimum", typeof(double), typeof(DualThumbSlider), new UIPropertyMetadata(0d));
public double LowerValue
{
get { return (double)GetValue(LowerValueProperty); }
set { SetValue(LowerValueProperty, value); }
}
public static readonly DependencyProperty LowerValueProperty =
DependencyProperty.Register("LowerValue", typeof(double), typeof(DualThumbSlider), new UIPropertyMetadata(0d));
public double UpperValue
{
get { return (double)GetValue(UpperValueProperty); }
set { SetValue(UpperValueProperty, value); }
}
public static readonly DependencyProperty UpperValueProperty =
DependencyProperty.Register("UpperValue", typeof(double), typeof(DualThumbSlider), new UIPropertyMetadata(0d));
public double Maximum
{
get { return (double)GetValue(MaximumProperty); }
set { SetValue(MaximumProperty, value); }
}
public static readonly DependencyProperty MaximumProperty =
DependencyProperty.Register("Maximum", typeof(double), typeof(DualThumbSlider), new UIPropertyMetadata(1d));
private void LowerSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
UpperSlider.Value = Math.Max(UpperSlider.Value, LowerSlider.Value);
}
private void UpperSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
LowerSlider.Value = Math.Min(UpperSlider.Value, LowerSlider.Value);
}
}
}