WPF控件之自定义TextBox控件
首先我们要知道用户控件与自定义用户控件的确保
用户控件
1将多个现有的控件组合成一个可重用的“组”。
2不能使用样式和模板。
3继承自UserControl类。
自定义控件
1在现有的控件上进行扩展,增加一些新的属性方法等。
2包括一个代码文件和一个默认的主题文件。
3可以使用样式和模板。
4构建控件库的好方法。
说白了一个就是把现有自带的控件进行一定的封装变成一个新的控件另一个是 修改稿原有的底层代码使得他具备了一些新的功效
现在 我们在以一个textbox 为例 我们想要文本框为空时显示水印,水印的内容可以自由改变,这个时候我们想到了用户控件 右键 新增 用户控件
在TextboxUserControl里添加TextBox。用户控件默认继承自UserControl类,现在的主要任务是当这个用户控件放到WPF窗体里面后,在窗体里能获取或设置里面的TextBox的值。
关键的一步是为这个用户控件添加一个依赖属性。
比如我要给这个用户控件添加一个Text属性,即当我将这个用户控件放到WPF窗口里要获取或者设置它的Text属性。
public string Text{get { return (string)GetValue(TextProperty); }Set { SetValue(TextProperty, value);}}public static readonly DependencyProperty TextProperty =DependencyProperty.Register("Text", typeof(string), typeof(TextboxUserControl), new PropertyMetadata(""));
然后主要是DependencyProperty.Register方法。
第一个参数,是你要为这个用户控件增加的属性的名字,即你在第一个参数里面填写什么字符串将来你的用户控件将会增加以这个字符串为名字的属性。
第二个参数是指这个属性对应的数据类型。
第三个参数这个属性所有者的类型。
第四个参数属性改变时触发的回调事件。
好了 用户控件第一步已经建立好了,我们在客户端也能够绑定好访问Text属性,但是 我们想要的水印还没有出现
首先我们要定义好一个水印的视觉刷 视觉刷的效果时根据客户端输入的水印来显示到视觉刷上面 放入TextBox.Resources里面 然后我们TextBox 添加一个样式当Text属性为空的时候设置Background 背景色为我们刚刚定义好的视觉刷
那么达这里我们的第二步就达成了 写好了相应的样式 我们会发现我们还缺失一个属性
那么我们重复第一不操作 添加一个水印的依赖属性WaterMarkText
到现在我们拥有水印的用户控件就基本完成了,以下时当前用户控件的全部代码
前端界面代码
<UserControl x:Class="Resources.UserControls.TextboxUserControl"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" x:Name="control"d:DesignHeight="100" d:DesignWidth="300"><DockPanel><TextBox DockPanel.Dock="Top" Padding="1.5" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" ToolTip="{Binding WaterMarkText,ElementName=control}" Width="{Binding ActualWidth,ElementName=control}" Height="{Binding ActualHeight,ElementName=control}" Name="txtFilter" Text="{Binding Path=Text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged, ElementName=control}" ><TextBox.Resources><VisualBrush x:Key="HelpBrush" TileMode="None" Opacity="0.5" Stretch="None" AlignmentX="Left"><VisualBrush.Visual><TextBlock Width="{Binding ActualWidth,ElementName=control}" VerticalAlignment="Center" FontStyle="Italic" FontSize="12" Text="{Binding WaterMarkText,ElementName=control}"/></VisualBrush.Visual></VisualBrush></TextBox.Resources><TextBox.Style><Style TargetType="TextBox"><Style.Triggers><Trigger Property="Text" Value="{x:Null}"><Setter Property="Background" Value="{StaticResource HelpBrush}"/></Trigger><Trigger Property="Text" Value=""><Setter Property="Background" Value="{StaticResource HelpBrush}"/></Trigger></Style.Triggers></Style></TextBox.Style></TextBox></DockPanel>
</UserControl>
后台代码
using System.Windows;
using System.Windows.Controls;namespace Resources.UserControls
{/// <summary>/// TextboxUserControl.xaml 的交互逻辑/// </summary>public partial class TextboxUserControl : UserControl{public string Text{get { return (string)GetValue(TextProperty); }set{SetValue(TextProperty, value);}}// Using a DependencyProperty as the backing store for Text. This enables animation, styling, binding, etc...public static readonly DependencyProperty TextProperty =DependencyProperty.Register("Text", typeof(string), typeof(TextboxUserControl), new PropertyMetadata(""));/// <summary>/// 添加附件依赖属性/// </summary>/// <param name="obj"></param>/// <returns></returns>//propdp 快捷方式public string WaterMarkText{get { return (string)GetValue(WaterMarkTextProperty); }set { SetValue(WaterMarkTextProperty, value); }}// Using a DependencyProperty as the backing store for Text. This enables animation, styling, binding, etc...public static readonly DependencyProperty WaterMarkTextProperty =DependencyProperty.Register("WaterMarkText", typeof(string), typeof(TextboxUserControl), new PropertyMetadata(""));public TextboxUserControl(){InitializeComponent();//if (DesignerProperties.GetIsInDesignMode(this)) return;}}
}
由于用户控件和样式我们在前面定义了资源字典 应用程序添加资源字典
在XAML页面进行调用我们封装好的控件的资源字典
我们就已经完成了一个完整的用户控件的制作了
WPF控件之自定义TextBox控件相关推荐
- Leaflet中实现添加比例尺控件与自定义版权控件与链接
场景 Leaflet快速入门与加载OSM显示地图: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/122290880 上面加载显示 ...
- android遥控杆控件,Android自定义滑杆控件SeekBar多功能版本
在应用开发中有没有遇到过通过滑杆控件选择一些区间条件实现参数变化?今天我们就来自定义View实现一个多功能又实用的版本SeekBar. Paste_Image.png ](http://upload- ...
- Android 自定义titlebar控件(自定义UI控件)
1.创建自定义的属性: 2.在自定义的布局中获取属性: 3.在mainActivity中使用 自定义控件,并使用自定义属性赋值. 1.创建自定义的属性创建 values/attr.xml 文件: &l ...
- 自定义ComboBox控件,完美解决C#自带的ComboBox效率慢的问题
自定义ComboBox控件,完美解决C#自带的ComboBox效率慢的问题 欢迎关注http://blog.csdn.net/aaa123524457 转载请注明出处:http://blog.csdn ...
- VB.NET怎样开发自定义Windows控件
前言 Microsoft® Visual Basic® 的组件支持历来都是它的一大卖点,于是第三方软件开发商们纷纷开发出各种具有新功能性的可视控件 (也有少数非可视控件) 供 Visual Basic ...
- Android View体系(十)自定义组合控件
相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源 ...
- winform 位置不空 隐藏控件_C#winform窗体点击TextBox控件,显示DateTimePicker日历控件,并获得日期值(可实现对日期赋空值)...
由于DateTimePicker不能赋空值,用此方法可以置默认日期值为空 步骤如下: 新建项目,个人用到vs2010 文件->新建->项目,选择windows窗体应用程序 2.拖控件,将T ...
- 高恪智能流控怎么设置_[高恪小知识]自定义流控的操作
自定义流控策略指导 高恪路由器的QoS智能流控模块下,数据从内网接口进外网接口出,从外网接口进内网接口出,在这个过程中,默认是不会对数据进行任何干预的.要对数据进行干预,通常我们就需要开启一键QoS智 ...
- 【写笔记】WPF 自定义简单的TextBox控件
效果图: 笔记分享: https://www.yuque.com/docs/share/4aac743b-1ff0-42d2-9ec3-c605c145a58e?# <WPF 自定义简单的Tex ...
最新文章
- 视频|立体视觉之立体匹配理论与实战
- RNQOJ Jam的计数法
- 参考平面及其高度_GCB | 盐沼和红树林湿地类型的转变会改变亚热带湿地对于海平面上升的脆弱性么?...
- C# 中文件路径的操作
- word可以直接导入mysql嘛_如何把word文档导入到数据库中——java POI
- uni - 使用npm
- java pgp加密_GPG(pgp)加解密中文完整教程
- Python华氏摄氏度的转换
- 网易云音乐api,网络太拥挤,登录失败
- 训练多个epoch来提高训练模型的准确率
- ionic3硬件检测、请求权限插件 Diagnostic 的用法
- 每日新闻:腾讯与Line携手在日本提供移动支付服务;阿里组织架构调整 行癫任阿里云智能总裁;每周要工作80小时才有可能改变世界...
- 10天学会PHP之PHP快速入门
- 【基础】代码操作Word时,自动更新目录(一)
- java秒表程序_运用Java编写 秒表程序
- PLSQL开发笔记和小结
- 灵机一栋团队alpha冲刺 Ⅳ
- 电脑音量100后还嫌小怎么办
- 泰拉瑞亚加mod之后如何搭建服务器进行联机
- ucore lab 2