WPF自定义控件Textbox 带水印 以及错误信息显示_02

前面写过一篇关于TextBox自定义控件 带水印以及错误信息显示的随笔 但是有一些BUG和一些功能不全面 这次基本补全 算是对上一篇的完善和升级。

前面只是实现了基本的水印信息以及错误信息显示.缺少了部分其他的功能

这次增加了以下功能:

  1.限定textbox文本框输入长度

  2.修复错误信息显示BUG.

  3.更改显示样式

  4.修改默认值赋值问题

先给大家来张图片看看

先贴出后台代码

  

  public partial class SelfWateMarkTextbox : System.Windows.Controls.UserControl
    {
        private const string defaultText = "";

        private const string IsInputText = "";

        private const string IsErrorText = "";

        private const string IsMaxLength = "30";

        public string TextValue = string.Empty;

        public SelfWateMarkTextbox()
        {
            InitializeComponent();

            this.Loaded += new RoutedEventHandler(WateMarkTextbox_Loaded);

            this.GotFocus += new RoutedEventHandler(WateMarkTextbox_GotFocus);

            this.LostFocus += new RoutedEventHandler(WateMarkTextbox_LostFocus);

            this.textBox1.TextChanged += new TextChangedEventHandler(TextBox1_TextChanged);

            this.txtErrorShow.TextChanged += new TextChangedEventHandler(txtErrorShow_TextChanged);
        }

        void txtErrorShow_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (!string.IsNullOrEmpty(this.txtErrorShow.Text) && txtErrorShow.Text.ToLower() == "true")
            {
                IsErrorShowBorder.Visibility = Visibility.Visible;
            }
            else
            {
                IsErrorShowBorder.Visibility = Visibility.Hidden;
            }
        }

        void TextBox1_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (TextValue != null && TextValue.Length > 0 && !this.textBox1.IsFocused)
            {
                this.textBox1.Text = TextValue;
            }
            else if (!string.IsNullOrEmpty(this.textBox1.Text) || this.textBox1.IsFocused)
            {
                this.textBox1.Text = this.textBox1.Text;
            }
            else
            {
                this.textBox1.Text = Watermark;
            }

            if (this.textBox1.Text != Watermark)
            {
                TextValue = this.textBox1.Text;
            }
            if (this.textBox1.Text != Watermark && this.textBox1.IsFocused)
            {
                IsErrorShowBorder.Visibility = Visibility.Hidden;
            }
        }

        void WateMarkTextbox_LostFocus(object sender, RoutedEventArgs e)
        {
            if (string.IsNullOrEmpty(this.textBox1.Text))
            {
                this.textBox1.Text = Watermark;
            }
        }

        void WateMarkTextbox_GotFocus(object sender, RoutedEventArgs e)
        {
            if (this.textBox1.Text.Equals(Watermark))
            {
                this.textBox1.Text = string.Empty;
            }
        }

        void WateMarkTextbox_Loaded(object sender, RoutedEventArgs e)
        {

            this.textBox1.Text = Watermark;
            this.IsInput.Content = IsRequired;
            this.IsError.Content = IsErrorMessage;
            this.textBox1.MaxLength = Convert.ToInt32(MaxLength);
        }

        public string Watermark
        {
            get
            {
                string result = (string)GetValue(WatermarkProperty);

                if (string.IsNullOrEmpty(result))
                {
                    result = defaultText;
                }

                return result;
            }

            set { SetValue(WatermarkProperty, value); }
        }

        public string IsRequired
        {
            get
            {
                string result = (string)GetValue(IsRequiredProperty);

                if (string.IsNullOrEmpty(result))
                {
                    result = IsInputText;
                }

                return result;
            }

            set { SetValue(IsRequiredProperty, value); }
        }

        public string IsErrorMessage
        {
            get
            {
                string result = (string)GetValue(IsErrorMessageProperty);

                if (string.IsNullOrEmpty(result))
                {
                    result = IsErrorText;
                }

                return result;
            }

            set { SetValue(IsErrorMessageProperty, value); }
        }

        public string MaxLength
        {
            get
            {
                string result = (string)GetValue(IsMaxLengthProperty);

                if (string.IsNullOrEmpty(result))
                {
                    result = IsMaxLength;
                }

                return result;
            }

            set { SetValue(IsMaxLengthProperty, value); }
        }

        public string IsErrorShow
        {

            set
            {
                txtErrorShow.Text = null;
                txtErrorShow.Text = value;
            }

        }

        public static readonly DependencyProperty WatermarkProperty =
            DependencyProperty.Register("Watermark", typeof(string), typeof(SelfWateMarkTextbox), new UIPropertyMetadata(defaultText));

        public static readonly DependencyProperty IsRequiredProperty =
                DependencyProperty.Register("IsRequired", typeof(string), typeof(SelfWateMarkTextbox), new UIPropertyMetadata(IsInputText));

        public static readonly DependencyProperty IsErrorMessageProperty =
            DependencyProperty.Register("IsErrorMessage", typeof(string), typeof(SelfWateMarkTextbox), new UIPropertyMetadata(IsErrorText));

        public static readonly DependencyProperty IsMaxLengthProperty =
           DependencyProperty.Register("MaxLength", typeof(string), typeof(SelfWateMarkTextbox), new UIPropertyMetadata(IsMaxLength));

    }

  前台代码

  

 <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" MaxWidth="20"></ColumnDefinition>
            <ColumnDefinition Width="1.5*"></ColumnDefinition>
            <ColumnDefinition Width="*"></ColumnDefinition>
            <ColumnDefinition Width="1"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Label Grid.Column="0" Name="IsInput" Foreground="Red" VerticalContentAlignment="Center"   HorizontalContentAlignment="Center">*</Label>
        <TextBox Grid.Column="1" VerticalContentAlignment="Center" x:Name="textBox1" TextWrapping="Wrap" />
        <Border Grid.Column="2" Name="IsErrorShowBorder" BorderThickness="1"  Background="LightPink"  CornerRadius="10"  Visibility="Hidden">
            <Label Name="IsError"  Foreground="Red" VerticalContentAlignment="Top" HorizontalContentAlignment="Center"></Label>
        </Border>
        <TextBox Grid.Column="3" VerticalContentAlignment="Center" Text="{Binding IsErroShow}"  x:Name="txtErrorShow"   Visibility="Hidden"/>
    </Grid>

调用界面代码

  

<Grid>
        <StackPanel>
            <my:SelfWateMarkTextbox x:Name="txtAccount"  Height="30" Width="300" IsErrorMessage="请输入账号" MaxLength="16"  IsRequired="*" Margin="5" />
            <my:SelfWateMarkTextbox  x:Name="txtName" Height="30" Width="300" IsErrorMessage="请输入姓名" MaxLength="8"  IsRequired="*" Margin="5" />
            <Button  Content="显示错误" Width="75" Height="21" Margin="5" Click="Button_Click"></Button>
        </StackPanel>

    </Grid>

这次基本没有问题了 我现在的项目中正在使用.暂时没发现什么问题.

如果你很懒

想要直接代码可去下面下载

http://download.csdn.net/detail/fm158512775/8103159;

时间: 2025-01-03 00:22:48

WPF自定义控件Textbox 带水印 以及错误信息显示_02的相关文章

WPF自定义控件Textbox 带水印 以及错误信息显示

经常做信息编辑界面的时候遇到需要水印功能,还有错误信息显示,必填项显示等功能.没有统一的样式规范很麻烦.正好最近调整界面,在网上查找了些资料,自己写了一个TextBox控件,带有水印功能,是否必填项,以及错误信息的显示. 我语言组织不行,直接上代码 界面代码 <UserControl x:Class="TextBoxEdit.SelfWateMarkTextbox" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/

WPF 自定义TextBox带水印控件,可设置圆角

一.简单设置水印TextBox控件,废话不多说看代码: <TextBox TextWrapping="Wrap" Margin="10" Height="69" Visibility="Visible"> <TextBox.Style> <Style TargetType="TextBox"> <Style.Triggers> <MultiTrigger

WPF自定义控件之带倒计时的按钮--Button

原文:WPF自定义控件之带倒计时的按钮--Button 1.说明 之前做过一个小项目,点击按钮,按钮进入倒计时无效状态,计时完成后,恢复原样,现在就实现该效果---带倒计时的按钮 2.效果 1)正常状态               2)MouseOver(只有背景色变化)         3)点击进入无效状态 4)在无效状态下计时              5)恢复正常状态 3.XAML代码 1 <!--冷却计时按钮样式--> <!--通过修改颜色值参数,以更改按钮颜色样式,更多修改,还

WPF自定义控件与样式(3)-TextBox &amp; RichTextBox &amp; PasswordBox样式、水印、Label标签、功能扩展

原文:WPF自定义控件与样式(3)-TextBox & RichTextBox & PasswordBox样式.水印.Label标签.功能扩展 一.前言.预览 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要是对文本输入控件进行样式开发,及相关扩展功能开发,主要内容包括: 基本文本框TextBox控件样式及扩展功能,实现了样式.水印.Label标签.功能扩展: 富

WPF 自定义控件并使用(例如带水印和字体图标的文本框)

一睹为快  创建方式: 先创建用户使用控件(UserControl) 修改用户使用控件前台代码左上角UserControl改为TextBox,后台带代码将UserControl替换为TextBox目的是让其控件继承TextBox控件,注意当前图中前台代码效果图: 后台的代码效果图: 创建依赖属性: 输入快捷键propdp双击Tab键生成代码 public int MyProperty { get { return (int)GetValue(MyPropertyProperty); } set

WPF自定义控件之水印文本(密码)框

首先来讲讲创建这个控件的初衷,一个让我很郁闷的问题. 公司的客户端项目采用WPF+MVVM技术实现,在近期地推客户端的过程中遇到了一个很奇葩的问题:在登录界面点击密码框就会直接闪退,没有任何提示 密码框是WPF原生的PasswordBox,这似乎没有什么不对.出现这个情况的一般是在xp系统(ghost的雨林木风版本或番茄花园),某些xp系统又不会出现. 出现这个问题的原因是因为客户的系统缺少PasswordBox使用的某种默认的字体,网上有人说是times new roman,又或者其它某种字体

WPF自定义控件与样式(12)-缩略图ThumbnailImage /gif动画图/图片列表

原文:WPF自定义控件与样式(12)-缩略图ThumbnailImage /gif动画图/图片列表 一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要针对WPF项目开发中图片的各种使用问题,经过总结,把一些经验分享一下.内容包括: WPF常用图像数据源ImageSource的创建: 自定义缩略图控件ThumbnailImage,支持网络图片.大图片.图片异步加载

WPF自定义控件与样式(14)-轻量MVVM模式实践

一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. MVVM是WPF中一个非常实用的编程模式,充分利用了WPF的绑定机制,体现了WPF数据驱动的优势.  图片来源:(WPF的MVVM) 关于MVVM网上很多介绍或者示例,本文不多做介绍了,本文的主要目的是提供一个轻量级的View Model实现,本文的主要内容: 依赖通知InotifyPropertyChanged实现: 命

WPF自定义控件与样式(13)-自定义窗体Window &amp; 自适应内容大小消息框MessageBox

一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 自定义Window窗体样式: 基于自定义窗体实现自定义MessageBox消息提示框: 二.自定义Window窗体样式 自定义的Window窗体效果:   因为WPF默认的窗体比较简陋,大都需要自己实现Window窗体样式效果,基本思路很简单: 第一步:干掉默认样式:WindowStyle = Windo