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

首先一个最简单最直接的方案就是自定义一个名为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(,
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(,
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, ))
{
FinalValue = (int)Math.Round(Value, );
}
}
}
}

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

WPF 中使slide控件拖动完成后改变变量值的更多相关文章

  1. WPF中的ControlTemplate(控件模板)(转)

    原文地址 http://www.cnblogs.com/zhouyinhui/archive/2007/03/28/690993.html WPF中的ControlTemplate(控件模板)     ...

  2. WPF中的ControlTemplate(控件模板)

    原文:WPF中的ControlTemplate(控件模板) WPF中的ControlTemplate(控件模板)                                             ...

  3. [转]WPF中的ControlTemplate(控件模板)

    WPF中的ControlTemplate(控件模板)                                                                           ...

  4. 在WPF中使用WinForm控件方法

    1.      首先添加对如下两个dll文件的引用:WindowsFormsIntegration.dll,System.Windows.Forms.dll. 2.      在要使用WinForm控 ...

  5. WPF中的image控件的Source赋值

    WPF中的Image控件Source的设置 1.XAML中 简单的方式(Source="haha.png"); image控件的Source设置为相对路径后(Source=&quo ...

  6. 在WPF中调用Winform控件

    最近在项目中用到了人脸识别和指纹识别,需要调用外部设备和接口,这里就用到了在WPF中调用Winform控件. 第一步,添加程序集引用.System.Windows.Forms和WindowsForms ...

  7. [转]在WPF中使用WinForm控件方法

    本文转自:http://blog.csdn.net/lianchangshuai/article/details/6415241 下面以在Wpf中添加ZedGraph(用于创建任意数据的二维线型.条型 ...

  8. WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件

    在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项 ...

  9. 在WPF中使用AForge控件

    AForge.NET 是用C#写的一个关于计算机视觉和人工智能领域的框架,它包括图像处理.神经网络.遗传算法和机器学习等. 要实现视频功能,需要使用AForge.Controls命名空间中的Video ...

随机推荐

  1. 解析java泛型(二)

    上篇我们简单的介绍了java中泛型的最基本的内容,知道了什么是泛型以及泛型对我们的程序编写有什么好处,最后一类型限定收尾.本篇将从类型限定开始阐述java泛型中很重要的概念:通配符 一.何为通配符   ...

  2. 更新几篇之前写在公众号上的文章:线性可分时SVM理论推导;关联分析做捆绑销售和推荐;分词、去停用词和画词云

    适合阅读人群:有一定的数学基础. 这几篇文章是16年写的,之前发布在个人公众号上,公众号现已弃用.回过头来再看这几篇文章,发现写的过于稚嫩,思考也不全面,这说明我又进步了,但还是作为学习笔记记在这里了 ...

  3. STM32F4的FPU单元讲解

    搞STM32F407单片机的时候 看见的关于STM32F4系列的FPU 单元讲解 比较精彩的博客  于是特意转载 和大家分享 转自:http://blog.renren.com/blog/256814 ...

  4. php投票练习

    一.题目要求:建立如下两个数据库,实现投票和%的统计结果: 二.具体编写方法: (1).建立数据库: 里面的蓝色背景的表格名称就是我们所需的表格! 表格内容如下: 表名:diaoyantimu 表名: ...

  5. Activiti工作流(二)之常用操作

    前面介绍了Activiti工作流的基本操作,但是在实际应用过程中,往往不满足项目需求,因此还需要了解一些其他的功能比如:连线.排他网关.并行网管.流程变量.个人任务及组任务的三种发布方式. 下面将介绍 ...

  6. 【转】Docker —— 从入门到实践

    http://yeasy.gitbooks.io/docker_practice/content/index.html Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud ...

  7. Struts2学习第一天——struts2基本流程与配置

    struts2框架 什么是框架,框架有什么用? 框架 是 实现部分功能的代码 (半成品),使用框架简化企业级软件开发 ,提高开发效率. 学习框架 ,清楚的知道框架能做什么? 还有哪些工作需要自己编码实 ...

  8. 【转载】JavaScript继承详解(二)

    这一章我们将会重点介绍JavaScript中几个重要的属性(this.constructor.prototype), 这些属性对于我们理解如何实现JavaScript中的类和继承起着至关重要的作用. ...

  9. ELK日志套件安装与使用

    1.ELK介绍     ELK不是一款软件,而是elasticsearch+Logstash+kibana三款开源软件组合而成的日志收集处理套件,堪称神器.其中Logstash负责日志收集,elast ...

  10. 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-2

    来个目录吧: 第一章 第二章 第三章 暂时就这么多.后面路线更新吧 Entity Framework Core Nuget包管理 如果你创建项目的时候启用了个人身份验证的话,项目中就已经包含了EFCo ...