这个效果我不太会描述 PlaceHolder直译占位符 也有人把这个效果叫水印效果 就是和HTML5的PlaceHolder属性一样的效果 上图直观:

占位符行为 PlaceHolderBehavior 的实现以及使用_程序集

使用方法:

首先下载 ​​占位符行为dll.rar​​ 在项目中引用dll

1.在VS中

引用System.Windows.Interactivity.dll程序集​

占位符行为 PlaceHolderBehavior 的实现以及使用_分割线_02

 

在xmal页面添加引用:

占位符行为 PlaceHolderBehavior 的实现以及使用_分割线_03

 然后附加到TextBox

 占位符行为 PlaceHolderBehavior 的实现以及使用_模版_04

设置行为的属性

占位符行为 PlaceHolderBehavior 的实现以及使用_控件_05

Text值肯定是要设置的了,这个是提示的文字.然后按需设置其他属性.不设置的话,默认取被附加的TextBox的值.

2.在Blend中

在blend中就非常简单了,直接拖到TextBox上就行了

占位符行为 PlaceHolderBehavior 的实现以及使用_程序集_06

设置属性

占位符行为 PlaceHolderBehavior 的实现以及使用_分割线_07

 

====================================分割线============================================

这个效果非常常见,又与业务无关,非常适合做成行为Behavior,以方便在不同的项目中使用,而不用去更改控件模版.

介绍下实现的思路:

TextBox中有一个组成部件:PART_ContentHost 用于显示文本

占位符行为 PlaceHolderBehavior 的实现以及使用_分割线_08

于是我想到的最简单的实现方法就是,在这个部件上面加一个TextBlock用于显示提示信息,在TextBox的Text的Length>0的时候隐藏该TextBlock,Length=0的时候显示该TextBlock

这样的话,就需要把这个部件拿出来,套上一个Grid,再在Grid里面加上TextBlock,然后把整个Grid放回原来的位置.

既然部件的父级能放下这个FrameworkElement类型的部件,那么它必然继承自Decorator或Panel中的一个.Decorator有Child属性,Panel有Children属性.(用户有可能改控件模版,换成Grid之类的,不改的话,就是继承自Decorator)

这样的话,找到这个部件和它的父级,就能实现这个效果了.

占位符行为 PlaceHolderBehavior 的实现以及使用_程序集_09

Panel我值考虑了4种情况:StackPanel,DockPanel,Grid,Canvas

依赖属性6个:Text,FontSize,Foreground,HorizontalAlignment,VerticalAlignment,Margin

个人能力有限,难免有不完善的地方,欢迎广大博友补充指正

 

最后附上完整Demo源码: ​​占位符行为源码.rar​