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的值。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 美食视频火了,既满足了视觉又满足了味觉