• WPF 中使slide控件拖动完成后改变变量值


    这个问题一开始觉得还是挺简单的,网上也看到不少解决方案。

    首先一个最简单最直接的方案就是自定义一个名为FinalValue的依赖属性。随后重载OnThumbDragCompleted函数,在Thumb控件完成拖动时改写FinalValue。代码如下

        public class SliderIgnoreDelta : Slider
        {
            public int FinalValue
            {
                get { return (int)GetValue(FinalValueProperty); }
                set { SetValue(FinalValueProperty, value); }
            }
    
            public static readonly DependencyProperty FinalValueProperty =
                DependencyProperty.Register(
                    "FinalValue", typeof(int), typeof(SliderIgnoreDelta),
                    new FrameworkPropertyMetadata(0,
                        FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnFinalValueChanged));
    
            private static void OnFinalValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
            {
                int result;
                if (int.TryParse(e.NewValue.ToString(), out result))
                {
                    if (((SliderIgnoreDelta) sender).Value != result)
                    {
                        ((SliderIgnoreDelta) sender).Value = result;
                    }
                }
            }
    
            protected override void OnThumbDragCompleted(System.Windows.Controls.Primitives.DragCompletedEventArgs e)
            {
                base.OnThumbDragCompleted(e);
                FinalValue = (int)Value;
            }
      }

    试着跑一下,似乎搞定了。等一下,左右键怎么不起作用了。看来还有问题。

    跟了一下,发觉只需要重写OnValue这个函数就可以实现左右键的功能,但光改写这一步还不行,如果在OnValue中不停的更改FinalValue的值那和原本的Slide还有什么区别呢?所以还要同步修改OnThumbStart,设一个标志位。

    最终代码如下

       public class SliderIgnoreDelta : Slider
        {
            public int FinalValue
            {
                get { return (int)GetValue(FinalValueProperty); }
                set { SetValue(FinalValueProperty, value); }
            }
    
            public static readonly DependencyProperty FinalValueProperty =
                DependencyProperty.Register(
                    "FinalValue", typeof(int), typeof(SliderIgnoreDelta),
                    new FrameworkPropertyMetadata(0,
                        FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnFinalValueChanged));
    
            private static void OnFinalValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
            {
                int result;
                if (int.TryParse(e.NewValue.ToString(), out result))
                {
                    if (((SliderIgnoreDelta) sender).Value != result)
                    {
                        ((SliderIgnoreDelta) sender).Value = result;
                    }
                }
            }
    
            public bool IsDragging { get; protected set; }
            protected override void OnThumbDragCompleted(System.Windows.Controls.Primitives.DragCompletedEventArgs e)
            {
                IsDragging = false;
                base.OnThumbDragCompleted(e);
                OnValueChanged(Value, Value);
            }
    
            protected override void OnThumbDragStarted(System.Windows.Controls.Primitives.DragStartedEventArgs e)
            {
                IsDragging = true;
                base.OnThumbDragStarted(e);
            }
    
            protected override void OnValueChanged(double oldValue, double newValue)
            {
                if (!IsDragging)
                {
                    base.OnValueChanged(oldValue, newValue);
                    if (FinalValue != (int)Math.Round(Value, 0))
                    {
                        FinalValue = (int)Math.Round(Value, 0);
                    }
                }
            }
        }

    最后还有一点要注意,FinalValue需要反写回Value中,Thumb的位置本质上还是反映Value的值。

  • 相关阅读:
    不写helloworld总觉得哪里似乎不对之javascript
    SQl中drop与truncate的区别
    对MarshalByRefObject的讲解(转自DuDu)
    “模态子窗体关闭后,父窗体也关闭”解决方案
    ENVI5.0 32位工具栏图标不显示解决办法
    HTML5的基础写法
    查询远程服务器数据
    javascript变量、作用域和内存问题
    javascript基本概念
    让应用程序具体相应权限
  • 原文地址:https://www.cnblogs.com/weloveamber/p/6617187.html
Copyright © 2020-2023  润新知