silverlight-带水印的自定义TextBox控件(版本2)

之前那个版本《silverlight-带水印的TextBox》不得不说是相当失败的,起码我是这样理解的。其实我一心想把这个给实现了,但是不得不承认自身技术上的缺陷。经过一番尝试和折腾,有了下面这个版本。

两个版本的区别:

其实是有本质的区别的。

之前那个版本只能设置“文本水印”,相当有局限性。现在的版本是可以自定义水印内容的。譬如,可以为button,rectangle,ellipsed... 

 

1.先新建一个“silverlight 模板化控件”,取名随意,此处为SuperText

2.修改继承的类Contol为TextBox

3.修改TextBox模板

控件SuperTextBox的模板,样式都是保存在一个叫“Generic.xaml”文件里面的。在第一次新建“silverlight 模板化控件”的时候,这个文件会自动产生。这里将TextBox的模板添加进入,并修改。

完整的

完整的Generic.xaml

 在上面的"Generic.xaml"文件的SuperTextBox模板中修改新增了一下内容

  • 新增一个UserControl,即水印内容。

取名随意,这里为“watermarkContent”,并且绑定Content属性为“WaterMark”

<UserControl x:Name="watermarkContent" Content="{TemplateBinding Watermark}"/>
  •  增加两个状态

状态为了控制水印是否出现。其实本质是调节水印的透明度。

<VisualStateGroup x:Name="WatermarkDisplayed">
    <VisualState x:Name="Hidden">
        <Storyboard>
            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="watermarkContent" Storyboard.TargetProperty="(UIElement.Opacity)">
                <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0" />
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
    </VisualState>
    <VisualState x:Name="Shown">
        <Storyboard>
            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="watermarkContent" Storyboard.TargetProperty="(UIElement.Opacity)">
                <SplineDoubleKeyFrame KeyTime="00:00:00" Value="1" />
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
    </VisualState>
</VisualStateGroup>

4.在托管代码中

  • 因为模板中绑定了一个新的属性WaterMark,所以需要在托管代码进行注册。并且用属性Watermark保存。
    public object Watermark
    {
        get { return base.GetValue(WatermarkProperty) as object; }
        set { base.SetValue(WatermarkProperty, value); }
    }
    
    //向空间增加property
    public static readonly DependencyProperty WatermarkProperty =
    DependencyProperty.Register("Watermark", typeof(object), typeof(SuperTextBox), new PropertyMetadata(null));

     

  • 为了控制水印状态需要增加一个TextChanged事件。
  • public SuperTextBox()
    {
        this.DefaultStyleKey = typeof(SuperTextBox);
        TextChanged += new TextChangedEventHandler(SuperTextBox_TextChanged);
    }
    
    void SuperTextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        TextBox tb = (TextBox)sender;
        if (tb.Text.Length > 0)
        {
            System.Windows.VisualStateManager.GoToState(tb, "Hidden", false);
        }
        else
        {
            System.Windows.VisualStateManager.GoToState(tb, "Shown", false);
        }
    }
  • 完整托管代码

完整的SuperTextBox托管代码

5.调用

<local:SuperTextBox Height="20">
                <local:SuperTextBox.Watermark>
                    <StackPanel Orientation="Horizontal" Opacity="0.4">
                        <Rectangle Fill="Red" Width="10" Height="10"/>
                        <TextBlock Text="我是一个水印"/>
                    </StackPanel>
                </local:SuperTextBox.Watermark>
            </local:SuperTextBox>

需加上命名空间local,local指向的是SuperTextBox所在的命名空间。

6.效果

时间: 2024-10-27 23:53:41

silverlight-带水印的自定义TextBox控件(版本2)的相关文章

在silverlight里自定义一个控件,在自定义控件类里面定义依赖属性出错。

问题描述 在silverlight里自定义一个控件,在自定义控件类里面定义依赖属性出错. 在silverlight里自定义一个控件ReplicationEventComboBox继承ComboBox,在ReplicationEventComboBox类里面定义依赖属性TextProperty. 其中ReplicationEventComboBox中 private TextBlock _text; 字段在方法OnApplyTemplate()中被赋值 var text = this.GetTem

Silverlight自定义数据绑定控件应该如何处理IEditableObject和IEditableCollectionView对象

最近在一直研究Silverlight下的数据绑定控件,发现有这样两个接口IEditableObject 和IEditableCollectionView,记录一下结论,欢迎交流指正. 本文会重点介绍在构建Silverlight自定义数据绑定控件的过程中,我们会对数据源进行操作,那么就会碰到上述两个接口,如何正确的处理它们.   IEditableObject 这个概念早在.Net 1.0的时候就提出了,但是我一直没有关注过这个东东. What is IEditableObject? IEdita

textbox控件-textBOX控件的属性设置

问题描述 textBOX控件的属性设置 VS2010中 textBOX控件怎么改成椭圆形的呢? 边角不是方的,是椭圆的那种 解决方案 VS2008以上自带,也可以从微软网站下载. 解决方案二: 自定义个组件吧,重绘textbox,绘制边框为非矩形 如果是wpf就简单了 解决方案三: 用VBPowerPack中的shape控件做一个圆角矩形,里面白色的形状 再把textBox放在里面,设置边框样式为无.即可. 解决方案四: 贴个截图看一下呢.... 解决方案五: 未运行 运行后

ASP.NET中使用自定义验证控件

asp.net|控件 asp.net 1.1中,有不少验证控件,大大方便了我们,但有的时候,当需要做特殊的验证时,还会觉得不够用的,于是我们可以用自定义验证控件CustomValidator,要使用这个控件,必须在服务端写相应的事件,格式如下: Sub FunctionName(sender as Object, args as ServerValidateEventArgs) ...End Sub其中注意两个参数 value:指示当前的CustomValidator验证的是哪一个控件 IsVa

iOS开发UI篇—Quartz2D(自定义UIImageView控件)

一.实现思路 Quartz2D最大的用途在于自定义View(自定义UI控件),当系统的View不能满足我们使用需求的时候,自定义View. 使用Quartz2D自定义View,可以从模仿系统的ImageView的使用开始. 需求驱动开发:模仿系统的imageview的使用过程 1.创建 2.设置图片 3.设置frame 4.把创建的自定义的view添加到界面上(在自定义的View中,需要一个image属性接收image图片参数->5). 5.添加一个image属性(接下来,拿到image之后,应

自定义组合控件问题-自定义组合控件onDraw()方法死循环

问题描述 自定义组合控件onDraw()方法死循环 自定义了一个组合控件,继承自LinearLayout,逻辑很简单,就是想实现一个带title的EditText.为了便于分析问题,已经将代码中的attrs.xml的属性删除,只留下导致问题出现的部分. 自定义控件的JAVA代码: package com.shuda.epmms.customview; import android.content.Context; import android.content.res.TypedArray; im

asp.net 动态创建TextBox控件及状态数据如何加载_实用技巧

接着上文Asp.net TextBox的TextChanged事件你真的清楚吗? 这里我们来说说状态数据时如何加载的.虽然在Control中有调用状态转存的方法,但是这里有一个判断条件 if (_controlState >= ControlState.ViewStateLoaded) 一般的get请求这里的条件是不满足的. 复制代码 代码如下: internal enum ControlState { Constructed, FrameworkInitialized, ChildrenIni

textbox控件字体在不同的系统上显示失败

问题描述 大家好:原先设计的时候是用宋体显示在TEXTBOX控件里(只读),但是做好SETUP包装到另一个机器上变成了西方语显示.如此一来最大的麻烦就是无法对齐格式...想问下有没有办法固定TEXTBOX的显示字体?就是说安装到别的机器上也用宋体来显示.不考虑对方机器缺少字体的情况.设计的时候属性兰fontname已经设成了宋体.谢谢拉!BRsDaido 解决方案 解决方案二:同样关注解决方案三:这个应该是处理不了的吧如果你绑定的字体对方计算机没有也就无法按你的字体显示拉个人觉得如果你把字体文件

还是Textbox控件的问题

问题描述 还是Textbox控件的问题....哦,也不一定是textbox的控件,包括其他winform的控件问题,控件里除了Tag,Text和Name的属性外,还有没有其他属性可以保存数据的啊??我知道可以自己再写个自定义控件可以实现,但是程序里的用到的控件是可以给几个文本框的赋值的,所以不能定死了是什么控件~~~例子:窗口中有TextBox1,TextBox2,Combobox1,DatePicker1等等DimCtrlXAsSystem.Windows.Forms.Control以下情况会