欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

WPF实现slide控件拖动完成后改变变量值

程序员文章站 2023-08-15 12:18:19
wpf中使slide控件拖动完成后改变变量值这个问题一开始觉得还是挺简单的,网上也看到不少解决方案。 首先一个最简单最直接的方案就是自定义一个名为finalvalue的依...

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的值。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。