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.效果

 

参考资料:《[控件问题] TextBox控件的Watermark问题变通解决方法
silverlight-带水印的TextBox
 
人生苦短,虚心求教

 本文转自 Ron Ngai 博客园博客,原文链接:http://www.cnblogs.com/rond/archive/2012/08/23/2652271.html  ,如需转载请自行联系原作者


相关文章
Silverlight自定义数据绑定控件应该如何处理IEditableObject和IEditableCollectionView对象
原文:Silverlight自定义数据绑定控件应该如何处理IEditableObject和IEditableCollectionView对象 原创文章,如需转载,请注明出处。   最近在一直研究Silverlight下的数据绑定控件,发现有这样两个接口IEditableObject 和IEditableCollectionView,记录一下结论,欢迎交流指正。
869 0
iis6.0 之前版本发布silverlight程序 注意事项
iis6.0出来的时侯 silverlight还没有出生。。silverlight发布后的文件中包含一些iis不认识文件。。 所以必须在iis6.0及之前的iis注册这种类型 打开iis,选择http头--》文件类型  然后添加如下三个类型。
674 0

热门文章

最新文章