wpf DualThumbSlider

Eden·2024년 6월 27일
0

양쪽으로 조절가능한 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);
        }
    }
}
profile
주섬주섬..

0개의 댓글