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(,
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控件拖动完成后改变变量值的更多相关文章
- WPF中的ControlTemplate(控件模板)(转)
原文地址 http://www.cnblogs.com/zhouyinhui/archive/2007/03/28/690993.html WPF中的ControlTemplate(控件模板) ...
- WPF中的ControlTemplate(控件模板)
原文:WPF中的ControlTemplate(控件模板) WPF中的ControlTemplate(控件模板) ...
- [转]WPF中的ControlTemplate(控件模板)
WPF中的ControlTemplate(控件模板) ...
- 在WPF中使用WinForm控件方法
1. 首先添加对如下两个dll文件的引用:WindowsFormsIntegration.dll,System.Windows.Forms.dll. 2. 在要使用WinForm控 ...
- WPF中的image控件的Source赋值
WPF中的Image控件Source的设置 1.XAML中 简单的方式(Source="haha.png"); image控件的Source设置为相对路径后(Source=&quo ...
- 在WPF中调用Winform控件
最近在项目中用到了人脸识别和指纹识别,需要调用外部设备和接口,这里就用到了在WPF中调用Winform控件. 第一步,添加程序集引用.System.Windows.Forms和WindowsForms ...
- [转]在WPF中使用WinForm控件方法
本文转自:http://blog.csdn.net/lianchangshuai/article/details/6415241 下面以在Wpf中添加ZedGraph(用于创建任意数据的二维线型.条型 ...
- WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件
在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项 ...
- 在WPF中使用AForge控件
AForge.NET 是用C#写的一个关于计算机视觉和人工智能领域的框架,它包括图像处理.神经网络.遗传算法和机器学习等. 要实现视频功能,需要使用AForge.Controls命名空间中的Video ...
随机推荐
- Linux安装 Mysql
背景 前不久开始学习部署ambari,在安装mysql的时候遇到了点问题,现在从网上找了点部署流程记录下来便于以后安装mysql. Centos 7.2 安装 Mysql 5.7.13 首先要安装yu ...
- MRC、ARC内存管理机制
MRC下,oc内存管理遵循"谁创建.谁释放.谁引用.谁管理"的机制,当创建或引用一个对象时,需要向她发送alloc,copy,retain消息,当释放该对象时需要发送release ...
- 用JS获取地址栏中的参数的简易方法
这个方法用起来超级简单,传入参数即可直接获取地址栏中的参数 代码如下 function GetQueryString(name) { var reg = new RegExp("(^|&am ...
- 一道面试题引发的对javascript类型转换的思考
最近群里有人发了下面这题:实现一个函数,运算结果可以满足如下预期结果: add(1)(2) // 3 add(1, 2, 3)(10) // 16 add(1)(2)(3)(4)(5) // 15 对 ...
- Django之Model世界
Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数 ...
- 辗转相除法求H.C.F小结
辗转相除法 大纲: 问题 原理 反思 1. 问题 一个试题,请完成以下填空 下列程序是利用辗转相除法求H.C.F(最大公约数) include <stdio.h> int main ...
- TokuDB性能测试报告
一 .背景介绍 近年来,TokuDB作为MySQL的大数据(Big Data)存储引擎受到人们的普遍关注.其架构的核心基于一种新的叫做分形树(Fractal Trees)的索引数据结构,该结构是缓存无 ...
- asp.net core mvc剖析:mvc动作选择
一个http请求过来后,首先经过路由规则的匹配,找到最符合条件的的IRouter,然后调用IRouter.RouteAsync来设置RouteContext.Handler,最后把请求交给RouteC ...
- 一段获取app性能指标的py脚本
#coding:utf-8 import os import timeimport datetimeimport subprocess ActivityManager = 'homepage.Main ...
- ZJOI2017 Day1
私のZJOI Day1 2017-3-21 07:52:53 有人在暴力膜 苟-- 富贵 无相忘 ZJOI2017交流群 133135071 如果你足够厉害 如果你足够厉害 如果你足够厉害 其实完全可 ...