首先,为什么需要自定义控件
一,项目中重复使用的控件,一处构造,处处使用,方便,简洁。
二,项目整体风格,当然用Style也能控制整个项目的风格,但个人认为用自定义控件,更容易做到,只需要改控件风格,就能让整个项目的风格改变。
三,特殊功能,在项目中往往控件库的控件满足不了需求,这时就需要自己动手,做出一些特殊功能的控件。
四,结构清晰,比如说,在项目中我们布局,是上标题,下类容,常规做法,是用控件拼成这样的布局,如果封装成控件,则只需要 给Title赋值,在填充类容。
第一节
从简单的TextBlock说起
比如说现在有这样一个需求,一个XAML有许多的TextBlock来显示字符,而这些字符长短不同,使TextBlock宽度不一致,是整个XAML看起来很杂乱,怎么办?
这个问题,首先我们会想,给TextBlock定义固定的长度啊,试想,如果一个字段5个字符,一个字段40个字符,这怎么定义长度,难道定义满足40字符宽度的吗?
首先,定义40字符宽的,不可能,这样5个字符岂不是很浪费空间。
那我们怎么办呢?
首先我们想啊,40和5我们取中间22.5,四舍五入后就是20,如果显示20,那剩下的20怎么办呢。我们是不是可以显示15个字符,然后后面用...代替,用鼠标移上去,在显示全部的字符。
如果这样做
第一种做法,写一个Convert类
public class TextBlockConvert : IValueConverter { #region IValueConverter 成员 public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return value.ToString().Length>15?value.ToString().Substring(0,15)+"...":value.ToString();//如果字符长度大于15截取加.... } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } #endregion }
XAML<TextBlock Text="{Binding Info,Converter={StaticResource txtBlockConvert}}" Margin="5"></TextBlock>第二种做法就是改装一下TextBlock,让他帮我们做Convert这件事。
public partial class StringFromtControl : UserControl { public StringFromtControl() { InitializeComponent(); } public static readonly DependencyProperty NumberProperty = DependencyProperty.Register("Number", typeof(int), typeof(StringFromtControl), new PropertyMetadata(15,new PropertyChangedCallback(NumbertPropertyChanged)));//注册超过多少字符截取属性,默认超过15个字符,截取加... public int Number { get { return (int)(GetValue(NumberProperty)); } set { SetValue(NumberProperty, value); } } public static void NumbertPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { StringFromtControl sf = (StringFromtControl)obj; sf.Number = (int)args.NewValue; sf.txt_Context.Text = sf.txt_Context.Text.Length > sf.Number ? sf.txt_Context.Text.Substring(0, sf.Number) : sf.txt_Context.Text; } public static readonly DependencyProperty LabelTextProperty = DependencyProperty.Register("LabelText", typeof(string), typeof(StringFromtControl), new PropertyMetadata(new PropertyChangedCallback(OnLabelTextPropertyChanged)));//定义字符属性 public string LabelText { get { return Convert.ToString(GetValue(LabelTextProperty)); } set { SetValue(LabelTextProperty, value); } } public static void OnLabelTextPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { StringFromtControl sf = (StringFromtControl)obj; string text = args.NewValue.ToString(); sf.txt_Context.Text = text.Length > sf.Number ? text.Substring(0, sf.Number) + "...." : text;//当字符长度超过Number长度时,截取加.... } /// <summary> /// 鼠标进去控件时,用ToolTip显示字符 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void txt_Context_MouseEnter(object sender, MouseEventArgs e) { Point p = e.GetPosition(canva); ToolTip tool = new ToolTip() { Content = (string)GetValue(LabelTextProperty) }; tool.Name = "tool"; tool.SetValue(Canvas.ZIndexProperty, 1); canva.Children.Add(tool); Canvas.SetLeft(tool, p.X); Canvas.SetTop(tool, p.Y); } /// <summary> /// 鼠标离开时,移除ToolTip /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void txt_Context_MouseLeave(object sender, MouseEventArgs e) { if (canva.FindName("tool") != null) { canva.Children.Remove((ToolTip)canva.FindName("tool")); } } }xaml
<Canvas x:Name="canva" Height="30" Width="100" > <TextBlock x:Name="txt_Context" Canvas.Top="6" MouseEnter="txt_Context_MouseEnter" VerticalAlignment="Center" MouseLeave="txt_Context_MouseLeave"></TextBlock> </Canvas>调用刚封装的TextBlock
<StackPanel> <my:StringFromtControl Number="20" LabelText="I Belive you" Margin="10"></my:StringFromtControl> <my:StringFromtControl Number="20" LabelText="I Belive you,I Belive you" Margin="10" ></my:StringFromtControl> <my:StringFromtControl Number="20" LabelText="I Belive you,I Belive you,I Belive you" Margin="10"></my:StringFromtControl> </StackPanel>效果
这样子看起来功能好像是实现了,但是第一个本来就没有超过20个字符,它也显示,这不太好...改改
/// <summary> /// 鼠标进去控件时,用ToolTip显示字符 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void txt_Context_MouseEnter(object sender, MouseEventArgs e) { Point p = e.GetPosition(canva); ToolTip tool = new ToolTip() { Content = (string)GetValue(LabelTextProperty) }; tool.Name = "tool"; tool.SetValue(Canvas.ZIndexProperty, 1); canva.Children.Add(tool); Canvas.SetLeft(tool, p.X); Canvas.SetTop(tool, p.Y); }
这个事件的改改,当字符不超过的失守我们不需要Add(tool)/// <summary> /// 鼠标进去控件时,用ToolTip显示字符 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void txt_Context_MouseEnter(object sender, MouseEventArgs e) { if (((string)GetValue(LabelTextProperty)).Length > (int)GetValue(NumberProperty))//当字符超过设定长度时间添加ToolTip { Point p = e.GetPosition(canva); ToolTip tool = new ToolTip() { Content = (string)GetValue(LabelTextProperty) }; tool.Name = "tool"; tool.SetValue(Canvas.ZIndexProperty, 1); canva.Children.Add(tool); Canvas.SetLeft(tool, p.X); Canvas.SetTop(tool, p.Y); } }
这样就好了,当字符不超过时,不会显示ToolTip。这是我的第一篇博客,写的不好,欢迎批评,这也是自学..所以有不足之处,忘谅解...以后每天一篇 除特殊情况..
相关推荐
为Silverlight创建自定义控件
学习用Silverlight创建自定义控件经典教程。
silverlight之自定义控件
全后台代码封装的自定义控件
简单的Silverlight 自定义控件源码
简单的Silverlight 自定义控件源码。 通过它,可以知道基本的silverlight自定义控件是如何编写的。
Silverlight 自定义控件 模板化控件 (一)属性
以前写ASP.NET winfrom 总想自己写自定义控件,一直也没机会写。心里挺痒痒的,最近用silverlight做项目。也没怎么用过silverlight硬着头皮看资料。看官方的开源扩展包。国内也没有比较好,比较全的这个资料吧。既然自己学会了就和大家分享下吧。 以 DataPager控件为示列 ,主要讲述。既有控件如何公开一个新属性。后续还会介绍更详细的。 为原有DataPager控件隐藏原有的PageCount属性,公开新的PageCount的属性。 原有的PageCou
SilverLight控件(详细)
SilverLight入门级的控件说明,需要实例,联系QQ 853466904
Silverlight 制作可拖动的自定义控件
Silverlight 制作可拖动的自定义控件 Silverlight 制作可拖动的自定义控件Silverlight 制作可拖动的自定义控件 Silverlight 制作可拖动的自定义控件
Silverlight 用户控件与自定义控件详解
Silverlight 用户控件与自定义控件详解 在Silverlight中你如果想把UI封装成单独的一部分或者创建一个新的页面,你可能会在Visual Studio中通过右击 “项目-> 添加-> 添加新项->Silverlight用户控件” 这样来创建控件。如果你是这么做的,那么这篇文章非常适合你。它将适用于任何基于...
Linux系统centos7安装网卡驱动
有时候我们装完Centos或Ubuntu系统会发现没有网卡信息,说明网卡驱动不配置,所以我们要重新安装。 首先去服务器主板官网下载网卡驱动,注意32位和64位。 先查看网卡型号 lspci | grep -i ethernet 我的网卡型号是 00:1f.6 Ethernet controller: Intel Corporation Device 0d55。 网上一找,压根没找到这型号的网卡,别说驱动了。怀着试一试的心态,就安装i219-v系的网卡驱动,还别说,成功了。 针对i21...
SilverLight中自定义用户控件
SilverLight中自定义用户控件 1. 新建一个自定义控件前台代码:UserControl x:Class="Binglang.SilverlightDemo5.SilverlightControl1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:
【第24例】华为 IPD 体系 | RMT 需求管理团队
RMT需求管理团队
YOLOv8【第十一章:视频追踪与流处理篇·第6节】BoT-SORT 改进:结合相机运动补偿(CMC)提升追踪稳定性!
🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。
一步一步创建自定义silverlight控件
注册了博客没有写一篇文章,浪费了空间。今天刚好跟同事聊到了silverlight 的控件自定义,写一篇 silverlight 2.0的也算是对以前的复习。 这个例子本身很简单,实现的是简单的带有动画的按钮,主要是谈谈其实现手法。其可分为几点一步一步实现: 1:创建一个silverlight 类库项目,我们将这个项目命名为:TestControl。...
第14.1章 高翔博士2025年11月最新开源框架Lightning-LM源码学习解读(一):激光-IMU定位+建图算法各模块简介
Lightning-LM:高效激光SLAM定位系统 该框架基于模块化设计,通过激光-IMU融合实现快速建图与定位,核心特点包括: 极速性能:纯CPU运行(建图1.2核/定位0.8核) 模块化架构:包含激光里程计(LIO)、地图管理、回环检测等独立模块 动态场景支持:地图分块加载、动静态图层分离 多模式适配:支持ROS2环境下的在线/离线运行 关键模块包括前端里程计(core/lio)、2D/3D地图转换(core/g2p5)、轻量优化库(core/miao)等,通过系统控制器(core/system)协调流
一个简单的Silverlight自定义日历控件
这几天编写的一个简单的silverlight自定义日历控件 可以实现鼠标左移或者右移的月份间淡进淡出切换 也可以通过后台属性传递包含2个string和一个int的object 其中int控制显示星级 效果如下图 下载地址:http://download.youkuaiyun.com/download/sweet_nail/4703120
39-Halcon-- fit_primitives_object_model_3d函数功能(从3D数据中提取几何基元)
Halcon算子fit_primitives_object_model_3d工业应用精要 该算子专为3D几何特征提取设计,支持平面、球体、圆柱等基元拟合。核心优势: 参数化输出:返回几何元素的数学参数(如平面方程、球心半径) 智能控制:通过max_dist、min_size等参数调节拟合精度 工业场景适配:针对薄壁件、孔系等提供专用优化方案 典型应用流程: 数据预处理(点云降噪/采样) 基元类型与参数设置 多阶段拟合(先平面后圆柱) 几何精度验证 误差控制在0.1%-1.2%范围内(视点云密度而定),适用于
图文详解Trae配置Java开发环境
本文介绍了Trae开发工具的安装配置流程:首先从官网下载安装Trae,然后安装Java开发所需的Extension Pack for Java和Spring Boot Extension Pack插件。关键步骤包括修改settings.json配置文件,需指定JDK路径、Maven可执行文件路径和用户设置文件路径。所有操作均配有图示说明,并强调要替换为实际电脑路径。
Silverlight自定义控件
最近需要实现一个立方体的功能,刚开始用的第三方控件Telerik中的RadCube,但是发现很难用,似乎长高宽都要设置为一致,而且不能 控制立方体转动的方式,所以自己想写个组件来实现。去看了下Silverlight的组件化,就开始动手了。 Silverlight的组件化,需要2个文件一个是组建的类文件:MyCube.cs,另外一个是Generic.xa...
【SECS】初识SECS协议
项目标题的第一位和第二位告诉下面有多少字节表示项目的长度。而项目的长度是指项目标题后面的字节数,这里第一个字节就是项目标题。1个字节可以表示的最大长度是0-255,所以只要项目标题后面的字节数小于等于254,都是0x01。
silverlight为自定义控件添加事件
1)用户控件SilverlightControl1.xaml.cs using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.
温升试验详解
温升试验是电子设备可靠性验证的重要手段,用于评估器件在正常工作或极限条件下的热稳定性。试验通过测量器件表面或关键点温度与环境温度的差值(ΔT),判断是否存在过热风险。主要依据行业标准,采用热电偶、热像仪等设备测量稳态温度。热阻分析可建立温升与功耗的关系,指导器件选型、PCB热设计和散热结构优化。典型应用包括电源模块和LED电路测试。温升试验通过系统性热分析,能有效提升产品在高负载、高温环境下的可靠性和安全性,对现代小型化、高密度电子设备尤为重要。
Outlook Express 6 (OE6) for Win7/Win8/Win10
英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。
Silverlight 2 创建自定义控件
超酷代码为 Silverlight 2 创建自定义控件Jeff Prosise<br />代码下载位置:WickedCode2008_08.exe(585 KB)<br />在线浏览代码本文将介绍以下内容:WPF 控件模型创建控件模板派生控件添加事件本文使用以下技术:<br />Silverlight 2<br />本文基于 Silverlight 2 的 Beta 2 版本。文中的所有信息均有可能发生变更。 目录 步骤 1:创建新的 Silverlight 项目<br />步骤 2:从控件(或 Cont
VC中sqlite的使用
在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示
silverlight 自定义控件基础篇(仿淘宝评论星级控件)
首先说说今天的控件能干什么? 1,仿淘宝的评论星级控件,鼠标滑过星星,会变亮。 2,可以用来,展示某一类对象的状态,或者统计信息,比如说,某一类对象,有1~10不同的状态,10为满状态,那么该控件就能根据该对象的状态显示。 显示方法(状态为1的 亮一颗星,灰色的9颗星,状态
lwip-2.0.3
lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。
华为的C语言编程规范.pdf
华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。
Silverlight 4 自定义控件属性设置
<br />最近在写一个silverlight 自定义控件的时候,在设置属性的时候遇到些问题。<br />上网搜索了一番,很多博客都引用博客园中万事大吉的一个silverlight自定义空间开发系列教程。大致方法是<br /> <br />publicstatic DependencyProperty TextProperty;<br /> <br />publicstring MyText<br />{<br />get<br />{<br />return (string)base.GetValue(T
步一步创建自定义silverlight控件
注册了博客没有写一篇文章,浪费了空间。今天刚好跟同事聊到了silverlight 的控件自定义,写一篇 silverlight 2.0的也算是对以前的复习。 这个例子本身很简单,实现的是简单的带有动画的按钮,主要是谈谈其实现手法。其可分为几点一步一步实现:1:创建一个silverlight 类库项目,我们将这个项目命名为:TestControl。然后在该项目下添加一个文件夹



772



被折叠的 条评论
为什么被折叠?



