WPF自定义控件(二)——TextBox

  和之前一样,先来看看效果:

  WPF自定义控件(二)——TextBox

  这个TextBox可设置水印,可设置必填和正则表达式验证。

  验证?没错,就是验证! 就是在输入完成后,控件一旦失去焦点就会自动验证!会根据我开放出来的“是否可以为空”属性进行验证,一旦为空,则控件变为警告样式。

  但这还不是最特别的,为了各种手机号啊,邮箱啊的验证,我还开放了一个正则表达式的属性,在这个属性中填上正则表达式,同上, 一旦失去焦点就会自动验证输入的内容能否匹配正则表达式,如果不能匹配,则控件变为警告样式。

  之后,代码还可以通过我开放的另一个属性来判断当前输入框的输入是否有误!

  好了,来看代码吧:

 1 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

 2                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

 3                     xmlns:ctrl="clr-namespace:KAN.WPF.XCtrl.Controls">

 4     <Style TargetType="{x:Type ctrl:XTextBox}">

 5         <!--StyleFocusVisual在上一篇里说了-->

 6         <Style.Resources>

 7             <ResourceDictionary Source="/KAN.WPF.Xctrl;component/Themes/CommonStyle.xaml"/>

 8         </Style.Resources>

 9         <Setter Property="FocusVisualStyle" Value="{StaticResource StyleFocusVisual}"/>

10         <Setter Property="BorderBrush" Value="Silver"/>

11         <Setter Property="BorderThickness" Value="1"/>

12         <Setter Property="Template">

13             <Setter.Value>

14                 <ControlTemplate TargetType="{x:Type ctrl:XTextBox}">

15                     <Border Name="brdText" Background="{TemplateBinding Background}"  BorderThickness="{TemplateBinding BorderThickness}"

16                           BorderBrush="{TemplateBinding BorderBrush}"  SnapsToDevicePixels="true" Padding="2">

17                         <Grid>

18                             <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>

19                             <StackPanel Orientation="Horizontal" Visibility="Collapsed" Name="stpWatermark">

20                                 <TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" 

21                                            FontSize="{TemplateBinding FontSize}" FontFamily="{TemplateBinding FontFamily}"

22                                            Foreground="{Binding XWmkForeground, RelativeSource={RelativeSource TemplatedParent}}" 

23                                            Text="{Binding XWmkText, RelativeSource={RelativeSource TemplatedParent}}" Cursor="IBeam" />

24                             </StackPanel>

25                             <ContentPresenter></ContentPresenter>

26                         </Grid>

27                     </Border>

28                     <ControlTemplate.Triggers>

29                         <!--当失去焦点并且没有输入任何内容时-->

30                         <MultiTrigger>

31                             <MultiTrigger.Conditions>

32                                 <Condition Property="Text" Value=""/>

33                                 <Condition Property="IsFocused" Value="False"/>

34                             </MultiTrigger.Conditions>

35                             <MultiTrigger.Setters>

36                                 <Setter Property="Visibility" TargetName="stpWatermark" Value="Visible"/>

37                             </MultiTrigger.Setters>

38                         </MultiTrigger>

39                         <!--当验证失败时-->

40                         <Trigger Property="XIsError" Value="true">

41                             <Setter TargetName="brdText" Property="BorderBrush" Value="Red" />

42                             <Setter TargetName="brdText" Property="Background" Value="Beige" />

43                         </Trigger>

44                     </ControlTemplate.Triggers>

45                 </ControlTemplate>

46             </Setter.Value>

47         </Setter>

48     </Style>

49 </ResourceDictionary>

  再来看看CS:

  1 using System;

  2 using System.Windows;

  3 using System.Windows.Controls;

  4 using System.Windows.Media;

  5 using System.Windows.Input;

  6 using System.Text.RegularExpressions;

  7 

  8 namespace KAN.WPF.XCtrl.Controls

  9 {

 10     /// <summary>

 11     /// 扩展输入框:可设置水印,可设置必填,可设置正则表达式验证

 12     /// </summary>

 13     public class XTextBox:TextBox

 14     {

 15         #region 依赖属性

 16         public static readonly DependencyProperty XWmkTextProperty;//水印文字

 17         public static readonly DependencyProperty XWmkForegroundProperty;//水印着色

 18         public static readonly DependencyProperty XIsErrorProperty;//是否字段有误

 19         public static readonly DependencyProperty XAllowNullProperty;//是否允许为空

 20         public static readonly DependencyProperty XRegExpProperty;//正则表达式

 21         #endregion

 22 

 23         #region 内部方法

 24         /// <summary>

 25         /// 注册事件

 26         /// </summary>

 27         public XTextBox()

 28         {

 29             this.LostFocus += new RoutedEventHandler(XTextBox_LostFocus);

 30             this.GotFocus += new RoutedEventHandler(XTextBox_GotFocus);

 31             this.PreviewMouseDown += new MouseButtonEventHandler(XTextBox_PreviewMouseDown);

 32         }

 33 

 34         /// <summary>

 35         /// 静态构造函数

 36         /// </summary>

 37         static XTextBox()

 38         {

 39             //注册依赖属性

 40             XTextBox.XWmkTextProperty = DependencyProperty.Register("XWmkText", typeof(String), typeof(XTextBox), new PropertyMetadata(null));

 41             XTextBox.XAllowNullProperty = DependencyProperty.Register("XAllowNull", typeof(bool), typeof(XTextBox), new PropertyMetadata(true));

 42             XTextBox.XIsErrorProperty = DependencyProperty.Register("XIsError", typeof(bool), typeof(XTextBox), new PropertyMetadata(false));

 43             XTextBox.XRegExpProperty = DependencyProperty.Register("XRegExp", typeof(string), typeof(XTextBox), new PropertyMetadata(""));

 44             XTextBox.XWmkForegroundProperty = DependencyProperty.Register("XWmkForeground", typeof(Brush), 

 45                 typeof(XTextBox), new PropertyMetadata(Brushes.Silver));

 46             FrameworkElement.DefaultStyleKeyProperty.OverrideMetadata(typeof(XTextBox), new FrameworkPropertyMetadata(typeof(XTextBox)));

 47         }

 48 

 49         /// <summary>

 50         /// 失去焦点时检查输入

 51         /// </summary>

 52         /// <param name="sender"></param>

 53         /// <param name="e"></param>

 54         void XTextBox_LostFocus(object sender, RoutedEventArgs e)

 55         {

 56             this.XIsError = false;

 57             if (XAllowNull == false && this.Text.Trim() == "")

 58             {

 59                 this.XIsError = true;

 60             }

 61             if (Regex.IsMatch(this.Text.Trim(), XRegExp) == false)

 62             {

 63                 this.XIsError = true;

 64             }

 65         }

 66 

 67         /// <summary>

 68         /// 获得焦点时选中文字

 69         /// </summary>

 70         /// <param name="sender"></param>

 71         /// <param name="e"></param>

 72         void XTextBox_GotFocus(object sender, RoutedEventArgs e)

 73         {

 74             this.SelectAll();

 75         }

 76 

 77         /// <summary>

 78         /// 鼠标点击时选中文字

 79         /// </summary>

 80         /// <param name="sender"></param>

 81         /// <param name="e"></param>

 82         void XTextBox_PreviewMouseDown(object sender, MouseButtonEventArgs e)

 83         {

 84             if (this.IsFocused == false)

 85             {

 86                 TextBox textBox = e.Source as TextBox;

 87                 textBox.Focus();

 88                 e.Handled = true;

 89             }

 90         }

 91         #endregion

 92 

 93         #region 公布属性

 94         /// <summary>

 95         /// 公布属性XWmkText(水印文字)

 96         /// </summary>

 97         public String XWmkText

 98         {

 99             get

100             {

101                 return base.GetValue(XTextBox.XWmkTextProperty) as String;

102             }

103             set

104             {

105                 base.SetValue(XTextBox.XWmkTextProperty, value);

106             }

107         }

108 

109         /// <summary>

110         /// 公布属性XWmkForeground(水印着色)

111         /// </summary>

112         public Brush XWmkForeground

113         {

114             get

115             {

116                 return base.GetValue(XTextBox.XWmkForegroundProperty) as Brush;

117             }

118             set

119             {

120                 base.SetValue(XTextBox.XWmkForegroundProperty, value);

121             }

122         }

123 

124         /// <summary>

125         /// 公布属性XIsError(是否字段有误)

126         /// </summary>

127         public bool XIsError

128         {

129             get

130             {

131                 return (bool)base.GetValue(XTextBox.XIsErrorProperty);

132             }

133             set

134             {

135                 base.SetValue(XTextBox.XIsErrorProperty, value);

136             }

137         }

138 

139         /// <summary>

140         /// 公布属性XAllowNull(是否允许为空)

141         /// </summary>

142         public bool XAllowNull

143         {

144             get

145             {

146                 return (bool)base.GetValue(XTextBox.XAllowNullProperty);

147             }

148             set

149             {

150                 base.SetValue(XTextBox.XAllowNullProperty, value);

151             }

152         }

153 

154         /// <summary>

155         /// 公布属性XRegExp(正则表达式)

156         /// </summary>

157         public string XRegExp

158         {

159             get

160             {

161                 return base.GetValue(XTextBox.XRegExpProperty) as string;

162             }

163             set

164             {

165                 base.SetValue(XTextBox.XRegExpProperty, value);

166             }

167         }

168         #endregion

169     }

170 }

  怎么样?还算不错吧!我觉得这个控件的用处算是最大的了!用上这个和上一篇的Button基本可以完成很多WPF项目了!

  不过~好像还少了个主窗体!没错!下一篇就来说说怎么自定义主窗体!

  有疑问的多留言哟!

你可能感兴趣的:(自定义控件)