123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- using System;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Input;
-
- namespace XHWK.WKTool
- {
- /// <summary>
- /// UC_MultiRangeSlider.xaml 的交互逻辑
- /// </summary>
- public partial class UC_MultiRangeSlider : UserControl
- {
- public UC_MultiRangeSlider()
- {
- InitializeComponent();
- }
- #region 私有变量
-
- private static int _width = 150; // 拖动条初始宽度
- private static int _height = 30; // 高度
- private static double _min = 0; // 最小值
- private static double _max = 1000; // 最大值
- private static int _freq = 1; // 出现刻度的间距
-
- #endregion
-
- /// <summary>
- /// 裁剪矩阵(头)
- /// </summary>
- private Rect StartRect
- {
- get
- {
- return (Rect)GetValue(StartRectProperty);
- }
- set
- {
- SetValue(StartRectProperty, value);
- }
- }
- private static readonly DependencyProperty StartRectProperty =
- DependencyProperty.Register("StartRect", typeof(Rect), typeof(UC_MultiRangeSlider));
-
- /// <summary>
- /// 裁剪矩阵(尾)
- /// </summary>
- private Rect EndRect
- {
- get { return (Rect)GetValue(EndRectProperty); }
- set { SetValue(EndRectProperty, value); }
- }
- private static readonly DependencyProperty EndRectProperty =
- DependencyProperty.Register("EndRect", typeof(Rect), typeof(UC_MultiRangeSlider));
-
- #region 公开依赖属性
-
- /// <summary>
- /// 刻度间距,默认为10
- /// </summary>
- public int SliderTickFrequency
- {
- get { return (int)GetValue(SliderTickFrequencyProperty); }
- set { SetValue(SliderTickFrequencyProperty, value); }
- }
- public static readonly DependencyProperty SliderTickFrequencyProperty =
- DependencyProperty.Register("SliderTickFrequency", typeof(int), typeof(UC_MultiRangeSlider), new PropertyMetadata(_freq));
-
- /// <summary>
- /// 控件高度,默认为30
- /// </summary>
- public int SilderHeight
- {
- get { return (int)GetValue(SilderHeightProperty); }
- set { SetValue(SilderHeightProperty, value); }
- }
- public static readonly DependencyProperty SilderHeightProperty =
- DependencyProperty.Register("SilderHeight", typeof(int), typeof(UC_MultiRangeSlider), new PropertyMetadata(_height));
-
- /// <summary>
- /// 拖动条宽度,默认为150
- /// </summary>
- public int SilderWidth
- {
- get { return (int)GetValue(SilderWidthProperty); }
- set { SetValue(SilderWidthProperty, value); }
- }
- public static readonly DependencyProperty SilderWidthProperty =
- DependencyProperty.Register("SilderWidth", typeof(int), typeof(UC_MultiRangeSlider), new PropertyMetadata(_width));
-
- /// <summary>
- /// 最小值,默认为0
- /// </summary>
- public double Minimum
- {
- get { return (double)GetValue(MinimumProperty); }
- set { SetValue(MinimumProperty, value); }
- }
- public static readonly DependencyProperty MinimumProperty =
- DependencyProperty.Register("Minimum", typeof(double), typeof(UC_MultiRangeSlider), new PropertyMetadata(_min));
-
- /// <summary>
- /// 最大值,默认为100
- /// </summary>
- public double Maximum
- {
- get { return (double)GetValue(MaximumProperty); }
- set { SetValue(MaximumProperty, value); }
- }
- public static readonly DependencyProperty MaximumProperty =
- DependencyProperty.Register("Maximum", typeof(double), typeof(UC_MultiRangeSlider), new PropertyMetadata(_max));
-
- /// <summary>
- /// 选中开始值,默认为0
- /// </summary>
- public double StartValue
- {
- get { return (double)GetValue(StartValueProperty); }
- set { SetValue(StartValueProperty, value); }
- }
- public static readonly DependencyProperty StartValueProperty =
- DependencyProperty.Register("StartValue", typeof(double), typeof(UC_MultiRangeSlider));
-
- /// <summary>
- /// 选中结束值,默认为100
- /// </summary>
- public double EndValue
- {
- get { return (double)GetValue(EndValueProperty); }
- set { SetValue(EndValueProperty, value); }
- }
- public static readonly DependencyProperty EndValueProperty =
- DependencyProperty.Register("EndValue", typeof(double), typeof(UC_MultiRangeSlider), new PropertyMetadata(_max));
-
- #endregion
-
- #region 前台交互
-
- /// <summary>
- /// 对两个拖动条进行裁剪
- /// </summary>
- private void ClipSilder()
- {
- double selectedValue = EndValue - StartValue;
- double totalValue = Maximum - Minimum;
- double sliderClipWidth = (double)SilderWidth * (StartValue - Minimum + selectedValue / 2.0) / totalValue;
- // 对第一个拖动条进行裁剪
- StartRect = new Rect(0, 0, sliderClipWidth, SilderHeight);
- // 对第二个拖动条进行裁剪
- EndRect = new Rect(sliderClipWidth, 0, SilderWidth, SilderHeight);
- }
-
- /// <summary>
- /// 初始化裁剪
- /// </summary>
- private void UC_Arrange_Loaded(object sender, RoutedEventArgs e)
- {
- ClipSilder();
- }
-
-
- private void SL_Bat1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
- {
- if (e.NewValue > EndValue) // 检查值范围
- StartValue = EndValue; // 超出,重设为最大值
- ClipSilder();
- }
-
- private void SL_Bat2_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
- {
- if (e.NewValue < StartValue)
- EndValue = StartValue;
- ClipSilder();
- }
-
- private void TextBox_KeyUp1(object sender, System.Windows.Input.KeyEventArgs e)
- {
- try
- {
- if (e.Key == Key.Enter) // 按回车时确认输入
- StartValue = Convert.ToInt32(((TextBox)sender).Text);
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- }
-
- private void TextBox_KeyUp2(object sender, KeyEventArgs e)
- {
- try
- {
- if (e.Key == Key.Enter)
- EndValue = Convert.ToInt32(((TextBox)sender).Text);
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- }
-
- #endregion
- }
- }
|