WPF 用户控件分享之边上带输入框的圆圈

WPF 用户控件分享之边上带输入框的圆圈

独立观察员 2022 年 8 月 20 日

最近有这样一个需求,有一圈圆形,每个圆形边上有个输入框,以下是完成后的效果图:

3aa81e2511c8fd415cbfab2e68b5981f.png

拿到这个需求后,分析界面上每个圆形和输入框应该视为一个用户控件,且输入框相对于圆形的位置不是一致的,所以应该要能够通过一个属性来设置输入框的位置。那么就以这个为突破口,创建一个用户控件,在代码隐藏页中添加一个用于控制输入框位置的依赖属性 “TextBoxPlacement”:

8730a24f8c044832b70d9b8992fc066f.png

【题外话]】添加依赖属性的方法为,输入 “propdp” 然后按 Tab 键(也就是使用官方提供的代码片段),然后修改类型、修改名称、修改所属类、修改默认值,如下:

5a5de193e3cc125f3b85481f4568af0d.png

继续说回 TextBoxPlacement 属性,我给它的类型是 PlacementMode,这是借用的 Popup 控件的方位属性:

400f4b677c1db81b7dba55102f26a2f0.png

这是个枚举,有很多取值情况,本次只是用到了它的子集(上下左右):

2883defb322353b5b9720b76a08bc413.png

好了,控制位置的属性有了,那么怎么动态切换呢?别急,我们先来看看整个用户控件的界面布局:

cbe5d1f55848aa5066f5c3690ceb825a.png

可以看到,界面上就只有一个 Control 元素,给它设置了一个样式,将在该样式中使用 DataTrigger(数据触发器)来切换不同的控件模板,从而改变布局。最开始想用数据模板选择器的,后来发现那个应该是适用于列表控件中依据数据不同从而动态选择子项的模板的情况,不适用于这种用户控件中。

最重要的就是给 Control 设置的样式 “CircleWithTextBoxStyle”:

c0d7f93546ad8a9f6649be7660542d08.png

上下左右这四种情况都是通过设置 Control 的 Template 的属性(具体是控件模板 ControlTemplate)来实现不同的布局的。默认是输入框在圆圈右边的布局,其余的 左、上、下 则是通过数据触发器 DataTrigger 来实现的,数据触发器绑定 UserControl 的 TextBoxPlacement 属性(前面我们添加的那个),依据不同的值来切换不同的控件模板。至于四种情况的布局实现,容器都是 StackPanel,左和右的时候是横向的,上和下的时候是纵向的;左和上的时候输入框部分写在前面,右和下的时候输入框部分写在后面。

圆圈和输入框部分也分别是一个 Control 元素,通过样式设置模板,样式如下:

8b7d50d0005171adbe2fdea73e9d7fa6.png

圆圈就是一个 Border,使用样式 BorderStyle。圈内文本是一个 TextBlock,使用样式 InfoStyle,文本内容绑定了一个依赖属性 CircleInfo。输入框就是一个 TextBox,使用样式 TextBoxStyle。

先来看看圆圈内文本样式,涉及两个依赖属性,一个是文字颜色属性 CircleForeground,另一个是文字大小属性 InfoFontSize(输入框也是用这个设置文字大小的),具体如下:

be39fab3697bb8403feb29802ed878e9.png

然后是圆圈和输入框的样式,涉及圆圈边框色属性 CircleBorderBackground,圆圈背景色属性 CircleBackground,圆圈直径和输入框宽度的共用属性 CircleAndTextBoxWidth,以及输入框的值属性 TextBoxValue: 

e82ba94688dd6259dac2ef2a99376f28.png

【题外话]】此处用到了一个叫做 CalcBinding 的库,可以绑定表达式,这样就省去了转换器,感兴趣的朋友可以自己搜索研究一下。

比如,此处的圆圈,是用宽高相等的 Border,然后圆角 CornerRadius 设为宽高的一半,直接绑定为 'Width / 2' 即可,十分方便。再比如,输入框和圆圈等宽,高度为宽度的五分之三,直接绑定 'Width * 3 / 5' 即可。

后面提到的依赖属性如下:

0c52cfa20ade2b20d7ae9d19e723c9b6.png

好了,整个用户控件都讲完了,那么如何使用呢?很简单,直接放在界面上,然后设置需要的依赖属性即可(此 Demo 源码地址文末会给出):

05479ca934bedde87894bb30f2e37909.png

开局那幅图(一整圈)的布局也可以浅看一下:

c2ba3f18d6ed1b78c374af98d3936236.png

其实也是分为上下左右四部分,通过 ItemsControl 来绑定数据,然后在数据模板中使用本文介绍的用户控件,样式如下,一些属性进行了设置和绑定:

03e7cf4817af71ce0af29c8761f29479.png

由于界面上的编号不是按布局的顺序来的,所以初始化时做了些处理:

09da4186eb25a48a946d22a7f4ca5739.png

Demo 源码地址(子模块中有用户控件源码):

https://gitee.com/dlgcy/DLGCY_WPFPractice/tree/Blog20220820 

f5bcc31656a9ff0e5e8206e6b5a22d53.png

全文完,感谢阅读!


WPF

分享一个 WPF 气泡弹框

WPF 表单验证之 INotifyDataErrorlnfo 接口的使用示例

[翻译] WPF 中用户控件 DataContext/Binding 和依赖属性的问题

OxyPlot 导出图片及 WPF 元素导出为图片的方法

让 WPF 的 RadioButton 支持再次点击取消选中的功能

WPF DataGrid 如何将被选中行带到视野中

WPF 触屏事件后触发鼠标事件的问题及 DataGrid 误触问题

WPF DataGrid 通过自定义表头模拟首行固定

WPF ComboBox 使用 ResourceBinding 动态绑定资源键并支持语言切换

【翻译】WPF 中附加行为的介绍 Introduction to Attached Behaviors in WPF

WPF 使用 Expression Design 画图导出及使用 Path 画图

WPF MVVM 弹框之等待框

解决 WPF 绑定集合后数据变动界面却不更新的问题(使用 ObservableCollection)

WPF 消息框 TextBox 绑定新数据时让光标和滚动条跳到最下面

真・WPF 按钮拖动和调整大小

WPF MVVM 模式下的弹窗

WPF 让一组 Button 实现 RadioButton 的当前样式效果

WPF 原生绑定和命令功能使用指南

WPF 用户控件的自定义依赖属性在 MVVM 模式下的使用备忘

在WPF的MVVM模式中使用OCX组件

第三方库使用

WPF 表格控件 ReoGrid 的简单使用

OxyPlot.WPF 公共属性一览

OxyPlot.Wpf 图表控件使用备忘

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 将是驱动 C# 增长的引擎吗 ?

C# 在中国的采用需要一个杀手级应用的带动, 那么这样的一个杀手级应用是 Unity吗,我这里大胆推测采用CoreCLR 的新一代完全采用C#构建的Unity 将是这样的一个杀手级应用。Unity已被广泛应用于数字孪生、数字城市、数字工厂等场景,成为各产业加…

Windows 超级开源实用工具:Microsoft PowerToys

实用工具集: Always on Top ​通过 Always on Top,可使用快捷键方式 (⊞ WinCtrlT) 将窗口固定在其他窗口的顶部。 ​ PowerToys Awake PowerToys Awake旨在使计算机保持唤醒状态,且无需管理其电源和睡眠设置。 运行耗时较长的任务时&#…

Python入门之数据类型

字符串 列表 元组 字典 转载于:https://www.cnblogs.com/py17/p/8919495.html

Kubeadm 快速搭建 k8s v1.24.1 集群(openEuler 22.03 LTS)

kubeadm 简介kubeadm 是 Kubernetes(以下简称 k8s)官方提供的用于快速安装部署 k8s 集群的工具,伴随 k8s 每个版本的发布都会同步更新,kubeadm 会对集群配置方面的一些实践做调整,通过实验 kubeadm 可以学习到 k8s 官方…

汇编试验五:编写、调试具有多个段的程序

ds 数据段放入数据正确; 两次push 操作后,ss栈段正确; 由于pop 操作顺序,ds数据段并没有发生改变; Source Code: assume cs:code, ds:data, ss:stackdata segmentdw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H …

SVN四部曲之SVN设置详解深入

想知道不同的设置是干什么用的,你只需将鼠标指针在编辑框/选项框上停留一秒钟...一个帮助提示气泡就会弹出来。 常规设置 图 4.68. 设置对话框,常规设置页面 这个对话框允许你指定自己喜欢的语言,同时也可做那些与Subversion相关的特殊设置。…

Vue3.2单文件组件setup的语法糖总结

目录 前言 setup语法糖 一、基本用法 二、data和methods 三、计算属性computed 四、监听器watch、watchEffect 五、自定义指令directive 六、import导入的内容可直接使用 七、声明props和emits 八、父组件获取子组件的数据 九、provide和inject传值 十、路由useRou…

使用dotnet-monitor分析在Kubernetes的应用程序:Sidecar模式

dotnet-monitor可以在Kubernetes中作为Sidecar运行,Sidecar是一个容器,它与应用程序在同一个Pod中运行,利用Sidecar模式使我们可以诊断及监控应用程序。如下图所示,这是我们最终要实现的目标,通过可视化界面查看应用程…

SFB 项目经验-07-Skype for Business 话机 Polycom CX700

本系列博文:Lync 项目经验-01-共存迁移-Lync2013-TO-SFB 2015-规划01http://dynamic.blog.51cto.com/711418/1858520 Lync 项目经验-02-共存迁移-Lync2013-TO-SFB 2015-规划02http://dynamic.blog.51cto.com/711418/1859143 Lync 项目经验-03-共存迁移-Lync2013-TO…

亿方云CEO程远:转型第一式:链接企业人与数据

传统企业一直在探讨如何做好互联网转型,那么互联网核心是什么?转型目标是什么?亿方云CEO程远在此次峰会上发表了自己看法,他认为快、人、连接是互联网核心基因,转型第一步就在于企业、人与数据的充分链接。中国企业的互…

使用.NET简单实现一个Redis的高性能克隆版(七-完结)

译者注该原文是Ayende Rahien大佬业余自己在使用C# 和 .NET构建一个简单、高性能兼容Redis协议的数据库的经历。首先这个"Redis"是非常简单的实现,但是他在优化这个简单"Redis"路程很有趣,也能给我们在从事性能优化工作时带来一些启…

解决 Vue 里 Script 标签首层不缩进 - VS Code

问题: 在 vscode 使用 vue 的时候,发现 script 标签首层不缩进??? 下载扩展:prettier 解决方法一: 打开 setting.json文件 添加:"prettier.vueIndentScriptAndStyle": tru…

Android应用开发性能优化完全分析

1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾。不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结、我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用&am…

ZBLOG-ASP2.2如何给图片增加ALT标签说明文字?

2019独角兽企业重金招聘Python工程师标准>>> 一直以来,我们在建设网站的时候,都容易犯下一个大错误,那就是没有重视图片的文字说明,而大多数时候,技术方面并不能很好的识别图片的内容,这也是受限…

[asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?

在QQ群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在Action中接收、我传的数组为什么Action的model中接收不到、或者我在ajax的data中设置了一些数组,为什么后台还是接收不了、还有一些怎么传送一个复杂的对象或者Action怎么接收一…

拒绝“高冷”词汇!初学C#中的委托

拒绝“高冷”词汇!初学C#中的委托 有一天,你写了好多好多带“形参”的构造函数(就是“方法”,同义),而且需要向这些构造函数里传递同样的“实参”,然后你就憨憨地一个一个函数的调用并赋予同样的…

JAVA企业级应用TOMCAT实战视频课程

1. Tomcat简介Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器…

WPF 系列-01默认程序结构

WPF应用程序启动项创建一个WPF应用程序&#xff0c;系统为我们自动生成了App.xaml和一个普通的MainWindow.xaml窗体文件。App.xaml 和cs 文件文件如下&#xff1a;<Application x:Class"Example_01.App"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/…

纳税服务系统【角色与用户】

用户与角色之间的关系 我们在做用户模块的时候&#xff0c;漏掉了最后一个功能。在新增功能中是可以选择角色的。 用户与角色之间的关系也是多对多 一个用户对应多个角色一个角色可以被多个用户使用。现在呢&#xff0c;我们的用户表已经是写的了。我们最好就不要修改原有的用户…

flex-grow flex-shrink 解决最后一行个数不足无法对齐

正常情况下&#xff0c;每页大小15个&#xff0c;设置每行3列&#xff0c;刚好5行。 当外部容器宽度不足以放3列时&#xff0c;自动换行&#xff0c;但最后一行元素自动撑满 &#xff0c;会造成元素块大小不一致&#xff0c;不是想要的效果 原始代码示例&#xff1a; <ul …