详解WPF双滑块控件的使用和强制捕获鼠标事件焦点

目录
  • 效果
  • 概述
  • 代码部分

效果

概述

最近有个小需求要用双滑块表示一个取值范围,于是就简单做了个用户控件,在此记录下.

使用矩形Rectangle表示范围,椭圆Ellipse表示滑块,使用Canvas控制滑块的左右移动.

椭圆的鼠标按下事件里强制获取鼠标事件焦点,避免移动过快或移出控件范围时,滑块就不跟着跑了.椭圆的鼠标抬起事件释放强制获取鼠标事件焦点

代码部分

需求比较简单,只定义了4个依赖属性,范围的最大值和最小值,取值的最大值和最小值.

接下来就是计算滑块和高亮矩形的位置,计算时注意减去椭圆Ellipse控件(圆)的半径,使圆心对准值,而不是左侧对准值.

鼠标移动的时候,计算当前位置对应的值,去改变依赖属性的值:

private void ell_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                double percentage = e.GetPosition(rect).X / rect.ActualWidth;
                double value = (Maximum - Minimum) * percentage + Minimum;
                if (_ellFromPressed)
                {
                    MinValue = (int)value;

                }
                if (_ellToPressed)
                {
                    MaxValue = (int)value;
                }
            }
        }

依赖属性的值变化,引起滑块的位置变化和高亮滑块宽度和位置的变化:

//最小值变化
        private void MinValuePropertyChanged()
        {
            if (MinValue < Minimum)
            {
                MinValue = Minimum;
                return;
            }
            if (MinValue > MaxValue)
            {
                MaxValue = MinValue;
            }
            //滑块位置变化
            _offsetFrom = (MinValue - Minimum) * rect.ActualWidth / (Maximum - Minimum) - 8;
            Canvas.SetLeft(ellFrom, _offsetFrom);
            //高亮矩形长度和位置的变化
            if (_offsetTo != -1)
            {
                double diff = _offsetTo - _offsetFrom;
                if (diff >= 0)
                {
                    rectHighLight.Width = diff;
                    Canvas.SetLeft(rectHighLight, _offsetFrom);
                }
            }
        }

        //最大值变化
        private void MaxValuePropertyChanged()
        {
            if (MaxValue > Maximum)
            {
                MaxValue = Maximum;
                return;
            }
            if (MaxValue < MinValue)
            {
                MinValue = MaxValue;
            }
            //滑块位置变化
            _offsetTo = (MaxValue - Minimum) * rect.ActualWidth / (Maximum - Minimum) - 8;
            Canvas.SetLeft(ellTo, _offsetTo);
            //高亮矩形长度和位置的变化
            if (_offsetFrom != -1)
            {
                double diff = _offsetTo - _offsetFrom;
                if (diff >= 0)
                {
                    rectHighLight.Width = diff;
                    Canvas.SetLeft(rectHighLight, _offsetFrom);
                }
            }
        }

取值的TextBox没有封装在用户控件里,是单独的两个TextBox跟依赖属性双向绑定的.注意绑定的时候触发方式最好不要用PropertyChanged,没有防抖效果,不然体验不是很好.回车触发就可以了.

前台双向绑定:

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
            <local:DoubleThumbSlider x:Name="dts" Width="500" Minimum="100" Maximum="200"></local:DoubleThumbSlider>
            <TextBox Name="tMin" Width="48" Text="{Binding ElementName=dts,Path=MinValue,UpdateSourceTrigger=Explicit,Mode=TwoWay}" PreviewKeyUp="tbox_PreviewKeyUp"></TextBox>
            <TextBlock Margin="5,0" Text="-"></TextBlock>
            <TextBox Name="tMax" Width="48" Text="{Binding ElementName=dts,Path=MaxValue,UpdateSourceTrigger=Explicit,Mode=TwoWay}" PreviewKeyUp="tbox_PreviewKeyUp"></TextBox>
        </StackPanel>

后台回车触发:

private void tbox_PreviewKeyUp(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                TextBox tbox = (TextBox)sender;
                var binding = tbox.GetBindingExpression(TextBox.TextProperty);
                binding.UpdateSource();
            }
        }

源码下载:DoubleThumbSlider.zip 提取码:1234

到此这篇关于详解WPF双滑块控件的使用和强制捕获鼠标事件焦点的文章就介绍到这了,更多相关WPF双滑块控件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • WPF弹出右键菜单时判断鼠标是否选中该项

    和上篇在WPF的TreeView中实现右键选定一样,这仍然是一个右键菜单的问题: 这个需求是在一个实现剪贴板的功能的时候遇到的:在弹出右键菜单时,如果菜单弹出位置在ListViewItem中时,我们认为这项已经被选中,可以使用剪贴板功能. 当菜单弹出位置在ListView的空白处时,我们一般认为没有项被选中,此时是不应该使能剪贴板功能的. 但是这个时候,该项仍然是选中的.不能通过Item的IsSelected的属性来区分这两种情况.这样,就需要我们加一个判断鼠标是否在所选的节点上的函数.实现这个

  • WPF实现背景灯光随鼠标闪动效果

    本文实例为大家分享了WPF实现背景灯光随鼠标闪动的具体代码,供大家参考,具体内容如下 实现效果如下: 思路:将容器分割成组合三角形Path,鼠标移动时更新每个三角形的填充颜色. 步骤: 1.窗体xaml 只需放置一个Canvas. <Canvas x:Name="container" Width="400" Height="400"></Canvas> 2.交互逻辑 /// <summary> /// Main

  • WPF常用控件用法及介绍

    1.GroupBox 注意: GroupBox仍然需要布局容器来放置元素.如: StackPanel面板 <GroupBox Header="select number?"> <StackPanel> <RadioButton>one</RadioButton> <RadioButton>two</RadioButton> <RadioButton>three</RadioButton> &

  • WPF滑块控件(Slider)的自定义样式

    前言 每次开发滑块控件的样式都要花很久去读样式代码,感觉有点记不牢,所以特此备忘. 自定义滑块样式 首先创建项目,添加Slider控件. 然后获取Slider的Window样式,如下图操作. 然后弹出界面如下.我们点击确定. 点击确定后,我们的页面的Resources中,增加了一系列样式代码,而滑块代码会被修改为如下样子: 可以看到,系统为我们的Slider控件增加了样式--Style="{DynamicResource SliderStyle1}" 现在我们查看样式SliderSty

  • WPF基本控件介绍

    上一章讲到了布局.这点就有点类似建筑设计.第一步是出图纸.整体的结构.而第二步就是堆砌, 建筑学里面也会有很多描述, 例如砖头,水泥.玻璃.瓷板.而在WPF中, 这一切的基础也就是控件.用于填充结构的UI控件. WPF的控件结构 各种控件类型详解 ContentControl 类 设置内容的属性为 Content, 例如 控件目录下只允许设置一次Content, 如下演示给按钮添加一个Image和一个文本显示Label, 错误如下: 正确的使用方式: <!利用我们上一章说讲到的布局容器装载在其中

  • WPF设置窗体可以使用鼠标拖动大小的方法

    本文实例讲述了WPF设置窗体可以使用鼠标拖动大小的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: private void Window_Loaded(object sender, RoutedEventArgs e) {     // 获取窗体句柄     IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle; // 获得窗体的 样式     int oldstyle = Nat

  • C#中WPF颜色对话框控件的实现

    在 C# WPF开发中颜色对话框控件(ColorDialog)用于对界面中的背景.文字…(拥有颜色属性的所有控件)设置颜色,例如设置标签控件的背景色. 颜色对话框的运行效果如下图所示: 标签背景色设置后如下: xml代码: <Window x:Class="WpfApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http

  • 详解WPF双滑块控件的使用和强制捕获鼠标事件焦点

    目录 效果 概述 代码部分 效果 概述 最近有个小需求要用双滑块表示一个取值范围,于是就简单做了个用户控件,在此记录下. 使用矩形Rectangle表示范围,椭圆Ellipse表示滑块,使用Canvas控制滑块的左右移动. 椭圆的鼠标按下事件里强制获取鼠标事件焦点,避免移动过快或移出控件范围时,滑块就不跟着跑了.椭圆的鼠标抬起事件释放强制获取鼠标事件焦点 代码部分 需求比较简单,只定义了4个依赖属性,范围的最大值和最小值,取值的最大值和最小值. 接下来就是计算滑块和高亮矩形的位置,计算时注意减去

  • 详解BootStrap中Affix控件的使用及保持布局的美观的方法

    Affix是BootStrap中的一个很有用的控件,他能够监视浏览器的滚动条的位置并让你的导航始终都在页面的可视区域.一开始的时候,导航在页面中是普通的流式布局,占有文档中固定的位置,当页面滚动的时候,导航就自动变成了固定布局(fixed),始终处于用户的视区,下面来说说他的用法.首先来看看他的实现原理.它是通过实时修改页面元素的class属性来实现的 开始的时候应用affix的元素的class中会自动添加affxi-top属性 当滚动条滚动以至于导航快要到页面顶部的时候这时候在元素的class

  • 详解Android 多级联动控件实现思路讨论

    最近有一个需求是选择多级联动数据,数据级别不固定,可能是五级,可能是两级,具体看用户等级. 所以就需要一个多级联动选择控件 ,在网上一番搜索或找到了这个控件, Android-PickerView 这个控件在三级以内的的联动都没有问题,但是最多只能到三级. 我在原有的基础上做了一些扩展,主要是添加了两个 picker MultiWheelPickerView 可以根据数据动态生成多个滚轮,不再局限于两个三个选项 DynamicWheelPickerView 也是动态生成,但可以一级一级的加载数据

  • 详解WPF中的APP生命周期以及全局异常捕获

    目录 APP生命周期 窗体生命周期事件 全局异常捕获 APP生命周期 wpf项目目录中有一个App.xaml.cs文件,该文件中App是一个partical类,与之对应的另一partical部分在App.g.i.cs文件中,该文件是在编译的时候WPF自动生成的.程序的入口Main方法在该文件中定义. [System.STAThreadAttribute()] [System.Diagnostics.DebuggerNonUserCodeAttribute()] [System.CodeDom.C

  • 详解ASP.NET-----Repeater数据控件的用法总结

    一.Repeater控件的用法流程及实例: 1.首先建立一个网站,新建一个网页index.aspx. 2.添加或者建立APP_Data数据文件,然后将用到的数据库文件放到APP_Data文件夹中. 3.打开数据库企业管理器,数据库服务器为local(.),然后将APP_Data文件夹中的数据库附加到数据库服务器中. 4.添加Ling to  SQL类. 5.打开视图,服务器资源管理器,右击数据库服务器,选择添加连接,然后选择数据库服务器.数据库类型,及数据库表,然后完成. 6.将需要用到的表,全

  • 实例详解jQuery结合GridView控件的使用方法

    jQuery是一种非常强大的客户端JS编程技术,这里不想过多阐述它的相关背景知识,只想简单演示一下如何与asp.net的控件结合开发. 比如,我们要做一个下面如图所示的功能,效果是状态.编号.数字1.数字2.平均值所有的项都是通过后台绑定,如何点击checkbox按钮,来实现自动计算当前行两个数字的平均值呢?前提是用jQuery来实现? 我们直接在页面的Page_Load事件中输入如下代码: protected void Page_Load(object sender, EventArgs e)

  • 详解vue-element Tree树形控件填坑路

    通过tree树形控件的default-checked-keys属性来设置默认选中的节点 html.vue <el-form-item label="角色权限:"> <el-tree :data="data2" show-checkbox node-key="id" @check="handleNodeClick" :default-expanded-keys="[]" ref="

  • 详解WPF如何在基础控件上显示Loading等待动画

    WPF 如何在基础控件上显示 Loading 等待动画 框架使用.NET4 至 .NET6: Visual Studio 2022; 使用方式需引入命名空间后设置控件的附加属性 wd:Loading.IsShow="true",即可显示默认等待动画效果如下: 如需自定义 Loading 一定要 先设置 wd:Loading.Child 在设置 IsShow="true" . 显示不同 Loading 内容需 wd:Loading.Child ={x:Static w

  • WPF实现在控件上显示Loading等待动画的方法详解

    WPF 如何在控件上显示 Loading 等待动画 框架使用.NET40: Visual Studio 2022; 使用方式需引入命名空间后设置控件的附加属性 wd:Loading.IsShow="true",即可显示默认等待动画效果如下: 如需自定义 Loading 一定要 先设置 wd:Loading.Child 在设置 IsShow="true" . 显示不同 Loading 内容需 wd:Loading.Child ={x:Static wd:NormalL

随机推荐