自定义silverlight控件

50、Silverlight 控件模板与自定义控件开发全解析 本博客深入解析了 Silverlight 中控件模板与自定义控件的开发技巧,包括状态转换、稳态动画、自定义动画转换、滑块控件的部件模型以及如何创建自定义控件 FlipPanel。通过实例代码和详细说明,帮助开发者掌握 Silverlight 的模板化无外观控件开发,以及如何通过 VisualStateManager 和动画实现动态、炫酷的用户界面。 阅读详情

首先,为什么需要自定义控件

一,项目中重复使用的控件,一处构造,处处使用,方便,简洁。

二,项目整体风格,当然用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。

这是我的第一篇博客,写的不好,欢迎批评,这也是自学..所以有不足之处,忘谅解...以后每天一篇 除特殊情况..

48、深入探索Silverlight控件模板与自定义控件 本文深入探讨了 Silverlight 开发中的控件模板和自定义控件技术,涵盖了模板绑定、样式设置、颜色复用以及部件和状态模型等核心主题。通过实际示例详细讲解了如何使用模板绑定解决属性值忽略问题,如何结合样式增强模板灵活性,如何通过颜色资源实现全局配色方案统一,以及如何利用状态模型实现动态的交互效果。同时,还介绍了自定义控件模板的创建流程和性能优化策略,为开发者提供了一套完整的 Silverlight 界面定制方案。 阅读详情

相关推荐

为Silverlight创建自定义控件

学习用Silverlight创建自定义控件经典教程。

silverlight之自定义控件

全后台代码封装的自定义控件

u014319138的专栏 772

简单的Silverlight 自定义控件源码

简单的Silverlight 自定义控件源码。 通过它,可以知道基本的silverlight自定义控件是如何编写的。

Silverlight 自定义控件 模板化控件 (一)属性

以前写ASP.NET winfrom 总想自己写自定义控件,一直也没机会写。心里挺痒痒的,最近用silverlight做项目。也没怎么用过silverlight硬着头皮看资料。看官方的开源扩展包。国内也没有比较好,比较全的这个资料吧。既然自己学会了就和大家分享下吧。      以 DataPager控件为示列 ,主要讲述。既有控件如何公开一个新属性。后续还会介绍更详细的。     为原有DataPager控件隐藏原有的PageCount属性,公开新的PageCount的属性。      原有的PageCou

蜗牛水里爬 4380

SilverLight控件(详细)

SilverLight入门级的控件说明,需要实例,联系QQ 853466904

Silverlight 制作可拖动的自定义控件

Silverlight 制作可拖动的自定义控件 Silverlight 制作可拖动的自定义控件Silverlight 制作可拖动的自定义控件 Silverlight 制作可拖动的自定义控件

Silverlight 用户控件与自定义控件详解

Silverlight 用户控件与自定义控件详解 在Silverlight中你如果想把UI封装成单独的一部分或者创建一个新的页面,你可能会在Visual Studio中通过右击 “项目-> 添加-> 添加新项->Silverlight用户控件” 这样来创建控件。如果你是这么做的,那么这篇文章非常适合你。它将适用于任何基于...

weixin_30672295的博客 166

Linux系统centos7安装网卡驱动

有时候我们装完Centos或Ubuntu系统会发现没有网卡信息,说明网卡驱动不配置,所以我们要重新安装。 首先去服务器主板官网下载网卡驱动,注意32位和64位。 先查看网卡型号 lspci | grep -i ethernet 我的网卡型号是 00:1f.6 Ethernet controller: Intel Corporation Device 0d55。 网上一找,压根没找到这型号的网卡,别说驱动了。怀着试一试的心态,就安装i219-v系的网卡驱动,还别说,成功了。 针对i21...

wshc18的博客 2万+

SilverLight中自定义用户控件

 SilverLight中自定义用户控件 1.  新建一个自定义控件前台代码:UserControl x:Class="Binglang.SilverlightDemo5.SilverlightControl1"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"     xmlns:

马立弘 647

【第24例】华为 IPD 体系 | RMT 需求管理团队

RMT需求管理团队

产品线负责人 1767

YOLOv8【第十一章:视频追踪与流处理篇·第6节】BoT-SORT 改进:结合相机运动补偿(CMC)提升追踪稳定性!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 719

一步一步创建自定义silverlight控件

注册了博客没有写一篇文章,浪费了空间。今天刚好跟同事聊到了silverlight 的控件自定义,写一篇 silverlight 2.0的也算是对以前的复习。 这个例子本身很简单,实现的是简单的带有动画的按钮,主要是谈谈其实现手法。其可分为几点一步一步实现: 1:创建一个silverlight 类库项目,我们将这个项目命名为:TestControl。...

dguu59309的博客 296

第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)协调流

行知SLAM 2439

一个简单的Silverlight自定义日历控件

这几天编写的一个简单的silverlight自定义日历控件 可以实现鼠标左移或者右移的月份间淡进淡出切换 也可以通过后台属性传递包含2个string和一个int的object 其中int控制显示星级 效果如下图 下载地址:http://download.youkuaiyun.com/download/sweet_nail/4703120

Take Something 899

39-Halcon-- fit_primitives_object_model_3d函数功能(从3D数据中提取几何基元)

Halcon算子fit_primitives_object_model_3d工业应用精要 该算子专为3D几何特征提取设计,支持平面、球体、圆柱等基元拟合。核心优势: 参数化输出:返回几何元素的数学参数(如平面方程、球心半径) 智能控制:通过max_dist、min_size等参数调节拟合精度 工业场景适配:针对薄壁件、孔系等提供专用优化方案 典型应用流程: 数据预处理(点云降噪/采样) 基元类型与参数设置 多阶段拟合(先平面后圆柱) 几何精度验证 误差控制在0.1%-1.2%范围内(视点云密度而定),适用于

weixin_45590420的博客 1162

图文详解Trae配置Java开发环境

本文介绍了Trae开发工具的安装配置流程:首先从官网下载安装Trae,然后安装Java开发所需的Extension Pack for Java和Spring Boot Extension Pack插件。关键步骤包括修改settings.json配置文件,需指定JDK路径、Maven可执行文件路径和用户设置文件路径。所有操作均配有图示说明,并强调要替换为实际电脑路径。

谷哥的小弟 6001

Silverlight自定义控件

最近需要实现一个立方体的功能,刚开始用的第三方控件Telerik中的RadCube,但是发现很难用,似乎长高宽都要设置为一致,而且不能 控制立方体转动的方式,所以自己想写个组件来实现。去看了下Silverlight的组件化,就开始动手了。 Silverlight的组件化,需要2个文件一个是组建的类文件:MyCube.cs,另外一个是Generic.xa...

adu777777的博客 123

【SECS】初识SECS协议

项目标题的第一位和第二位告诉下面有多少字节表示项目的长度。而项目的长度是指项目标题后面的字节数,这里第一个字节就是项目标题。1个字节可以表示的最大长度是0-255,所以只要项目标题后面的字节数小于等于254,都是0x01。

weixin_48618536的博客 1647

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.

czh4869623的专栏 2218

温升试验详解

温升试验是电子设备可靠性验证的重要手段,用于评估器件在正常工作或极限条件下的热稳定性。试验通过测量器件表面或关键点温度与环境温度的差值(ΔT),判断是否存在过热风险。主要依据行业标准,采用热电偶、热像仪等设备测量稳态温度。热阻分析可建立温升与功耗的关系,指导器件选型、PCB热设计和散热结构优化。典型应用包括电源模块和LED电路测试。温升试验通过系统性热分析,能有效提升产品在高负载、高温环境下的可靠性和安全性,对现代小型化、高密度电子设备尤为重要。

硬核科技 1332

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

lionzl的专栏 899

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

silverlight 自定义控件基础篇(仿淘宝评论星级控件)

首先说说今天的控件能干什么? 1,仿淘宝的评论星级控件,鼠标滑过星星,会变亮。 2,可以用来,展示某一类对象的状态,或者统计信息,比如说,某一类对象,有1~10不同的状态,10为满状态,那么该控件就能根据该对象的状态显示。 显示方法(状态为1的 亮一颗星,灰色的9颗星,状态

3024

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

cappcinuo的专栏 1305

步一步创建自定义silverlight控件

注册了博客没有写一篇文章,浪费了空间。今天刚好跟同事聊到了silverlight 的控件自定义,写一篇 silverlight 2.0的也算是对以前的复习。         这个例子本身很简单,实现的是简单的带有动画的按钮,主要是谈谈其实现手法。其可分为几点一步一步实现:1:创建一个silverlight 类库项目,我们将这个项目命名为:TestControl。然后在该项目下添加一个文件夹

爱吃肉的熊猫 1363
下一篇: silverlight 自定义控件基础篇(仿淘宝评论星级控件)
黄瓜黄瓜
博客等级 码龄15年 27粉丝 12原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值