win10 uwp 验证输入 自定义用户控件
TextBox是给用户输入,我们有时要用户只输入数字,而用户输入汉字,我们就有提示用户,那么这东西用到次数很多,我们需要做成一个控件。
我们可以用别人的库,我找到一个大神写的库,很好用
我们使用这个库可以定义很多验证,我记录我如何使用他这个库,还有如何去修改这个库。如何自定义控件做一个和大神做的一样的控件。
Nuget
我们用这个库是jamescroft写的,他上传到Nuget,我们可以去下载
用Nuget搜索WinUX.UWP.Xaml.Controls
下载完成就好
使用库
我们经常需要验证用户输入,不是使用一个规则,是有很多规则。我们常用的规则也就几个,数字、URL……
我们下载库,有常用规则
– DateTimeValidationRule
日期规则,输入可以转日期
– DecimalValidationRule
数字,输入可以转数字
– DoubleValidationRule
输入可以转浮点
– EmailValidationRule
邮箱,输入是mail
– IntValidationRule
整形,输入可以转整形
– RegexValidationRule
我们自己定义正则,有时我们需要复杂的,要求长度
– UrlValidationRule
输入是URL
我们要在资源定义,因为我们有多条验证
先写,因为我们引用库和我的不知一空间
xmlns:validation="using:WinUX.Data.Validation"
xmlns:rules="using:WinUX.Data.Validation.Rules"
xmlns:controls="using:WinUX.Xaml.Controls"
在资源定义,我们需要多条,看起来好长,如果我们要用两次,那么还是写资源
<Grid.Resources>
<validation:ValidationRules x:Key="UrlSample">
<validation:ValidationRules.Rules>
<rules:UrlValidationRule />
</validation:ValidationRules.Rules>
</validation:ValidationRules>
</Grid.Resources>
下面直接抄大神写的
<controls:ValidatingTextBox IsMandatory="True" Header="Website" Text="http://www.jamescroft.co.uk"
MaxLength="50"
ValidationRules="{StaticResource Url}"
VerticalAlignment="Center"/>
MaxLength
最大长度
ValidationRules
验证规则
IsMandatory
输入规则
MandatoryValidationMessage
输入规则提示
如果IsMandatory=true
在没有输入,显示MandatoryValidationMessage
IsInvalid
输入是否对
这个值绑定到ViewModel可以得到是否可以输入到ViewModel
如果我们需要写输入错了提示
<rules:UrlValidationRule ErrorMessage="输入错"></rules:UrlValidationRule>
如果需要使用正则,我们的验证复制,需要使用RegexValidationRule
,在Regex
写正则
<controls:ValidatingTextBox IsMandatory="True" Header="Website" Text=""
MaxLength="0" MandatoryValidationMessage="输入"
VerticalAlignment="Center">
<controls:ValidatingTextBox.ValidationRules>
<validation:ValidationRules>
<validation:ValidationRules.Rules>
<rules:RegexValidationRule Regex="mailto:\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*"></rules:RegexValidationRule>
</validation:ValidationRules.Rules>
</validation:ValidationRules>
</controls:ValidatingTextBox.ValidationRules>
<controls:ValidatingTextBox.ValidationTextBlock >
<TextBlock Text="ValidationTextBlock"></TextBlock>
</controls:ValidatingTextBox.ValidationTextBlock>
</controls:ValidatingTextBox>
使用很简单,那么这如何做。
下面我来说下,他这个如何做,这有些复杂,我们分开来说,开始是功能
判断输入字符长度
我们需要一个TextBlock来显示最大长度、现在字符长度
我们的TextBlock的名称remainingCharacters
,在输入变化修改
private void UpdateRemainingCharacters()
{
//判断不为空
if (this.remainingCharacters != null)
{
//如果最大长度==0,不显示
if (this.MaxLength == 0)
{
this.remainingCharacters.Visibility = Visibility.Collapsed;
return;
}
//Text是现在字符,我们用一个新字符串来得到
var remainingChar = string.Format("{0}/{1}", this.Text.Length, this.MaxLength);
this.remainingCharacters.Text = remainingChar;
//这句是没用
this.remainingCharacters.Visibility = this.MaxLength > 0 ? Visibility.Visible : Visibility.Collapsed;
}
}
上面是大神写的,我建议可以简单一点。
private void UpdateRemainingCharacters()
{
if (remainingCharacters != null)
{
if (MaxLength == 0)
{
remainingCharacters.Visibility = Visibility.Collapsed;
return;
}
int length = 0;
if (!string.IsNullOrEmpty(Text))
{
length = Text.Length;
}
var remainingChar = string.Format("{0}/{1}", length, MaxLength);
remainingCharacters.Text = remainingChar;
//The above has judge the MaxLength ,and if it's 0,the Visibility will Collapsed
//上面代码有判断MaxLength,如果是0,隐藏
//this.remainingCharacters.Visibility = this.MaxLength > 0 ? Visibility.Visible : Visibility.Collapsed;
}
}
是否要检查
我们先判断是否要检查,如果不要检查,那么就返回对
return !IsMandatory;
如果要检查,我们的输入是空,我们要提示用户输入
if (!this.IsMandatory && string.IsNullOrWhiteSpace(this.Text))
{
ValidationTextBlock.Text = this.MandatoryValidationMessage;
}
ValidationTextBlock就是提示
我们判断,如果输入不是空,就返回,规则判断。
于是我们改为 如果不检查或输入是不空的,返回true,继续规则
如果检查并输入空,我们继续
输入空,我们提示
ValidationTextBlock.Text = this.MandatoryValidationMessage;
总的
public bool IsMandatoryFieldValid()
{
//不检查 || 输入不是空
//如果不检查,true
//如果检查 如果输入不是空 true
if (!this.IsMandatory || !string.IsNullOrWhiteSpace(this.Text))
{
return true;
}
if (this.ValidationTextBlock != null)
{
this.ValidationTextBlock.Text = this.MandatoryValidationMessage;
}
VisualStateManager.GoToState(this, "Mandatory", true);
return false;
}
长度
我们通过检查验证,我们继续
这时我们可以检查长度 Text.Length > this.MaxLength
如果大于长度,不通过
bool[] isInvalid = { !this.IsMandatoryFieldValid() };
if (!isInvalid[0])
{
if (this.MaxLength > 0)
{
isInvalid[0] = this.Text.Length > this.MaxLength;
}
if (isInvalid[0])
{
if (this.ValidationTextBlock != null)
{
this.ValidationTextBlock.Text = "The text exceeds the maximum length.";
}
}
} //不知道isInvalid
判断
如果输入长度不大于最大,我们判断是否符合要求
if (ValidationRules != null)
{
foreach (var temp in ValidationRules.Rules)
{
isInvalid[0] = !temp.IsValid(Text);
if (isInvalid[0] && ValidationTextBlock != null)
{
ValidationTextBlock.Text = temp.ErrorMessage;
break;
}
}
}
大神写的使用TakeWhile,这判断符合条件,如果符合,返回
if (!isInvalid[0])
{
if (this.MaxLength > 0)
{
isInvalid[0] = this.Text.Length > this.MaxLength;
}
if (isInvalid[0])
{
if (this.ValidationTextBlock != null)
{
this.ValidationTextBlock.Text = "The text exceeds the maximum length.";
}
}
else
{
if (this.ValidationRules != null)
{
// Run through all of the validation rules for this text box and check is valid.
foreach (var rule in this.ValidationRules.Rules.TakeWhile(rule => !isInvalid[0]))
{
isInvalid[0] = !rule.IsValid(this.Text);
if (isInvalid[0] && this.ValidationTextBlock != null)
{
this.ValidationTextBlock.Text = rule.ErrorMessage;
}
}
}
//if (ValidationRules != null)
//{
// foreach (var temp in ValidationRules.Rules)
// {
// isInvalid[0] = !temp.IsValid(Text);
// if (isInvalid[0] && ValidationTextBlock != null)
// {
// ValidationTextBlock.Text = temp.ErrorMessage;
// break;
// }
// }
//}
}
}
我们需要把判断放到IsInvalid,IsInvalid = isInvalid[0];
我们把上面写的做函数,输入改变我们使用
private void OnTextChanged(object sender, TextChangedEventArgs args)
{
this.Update();
}
如何写检查
我们的核心就是它,我们需要一个类来放用户写的检查
这类我就放public List<ValidationRule> Rules { get; private set; }
开始核心ValidationRule,我们有很多检查,我们需要一个ValidationRule,定义的检查都可以修改ValidationRule新检查
ValidationRule只有一个属性,错误显示的Message
private string _errorMessage;
public string ErrorMessage
{
set
{
this._errorMessage = value;
}
get
{
return string.IsNullOrWhiteSpace(this._errorMessage) ? "Field invalid." : this._errorMessage;
}
}
其实如果_errorMessage
不存在,我们要返回默认的,不要返回”Field invalid.”
/// <summary>
/// If the errorMessage is null
/// return DefaultErrorMessage
/// </summary>
public static string DefaultErrorMessage
{
set;
get;
} = "Field invalid.";
private string _errorMessage;
/// <summary>
/// Gets the error message to display for the rule.
/// </summary>
public string ErrorMessage
{
set
{
this._errorMessage = value;
}
get
{
return string.IsNullOrWhiteSpace(this._errorMessage) ? DefaultErrorMessage : this._errorMessage;
}
}
然后就是一个函数,判断是否通过
public abstract bool IsValid(object value);
然后我们可以开始做检查
如DateTime
public override bool IsValid(object value)
{
if (value == null)
{
return false;
}
var val = value.ToString();
if (string.IsNullOrWhiteSpace(val))
{
return true;
}
DateTime temp;
return DateTime.TryParse(val, out temp);
}
decimal
public override bool IsValid(object value)
{
if (value == null)
{
return false;
}
var val = value.ToString();
if (string.IsNullOrWhiteSpace(val))
{
return true;
}
decimal temp;
return decimal.TryParse(val, out temp);
}
用户控件
我们使用继承TextBox做自己的控件
public partial class ValidatingTextBox : TextBox
我们上面用了remainingCharacters
ValidationTextBlock
我们需要把它显示
我们告诉后来写ControlTemplate 我们要remainingCharactersTextBlock ValidationTextBlock,我们给他名字 RemainingCharacters,ValidationText 我们就可以在OnApplyTemplate
protected override void OnApplyTemplate()
{
base.OnApplyTemplate();
this.remainingCharacters = this.GetTemplateChild("RemainingCharacters") as TextBlock;
this.ValidationTextBlock = this.GetTemplateChild("ValidationText") as TextBlock;
}
但我们需在ValidatingTextBox
[TemplatePart(Name = "ValidationText", Type = typeof(TextBlock))]
[TemplatePart(Name = "RemainingCharacters", Type = typeof(TextBlock))]
垃圾wr做这是做界面的人和做逻辑可以两个人,做界面只要知道有那些控件就好
TemplatePart是告诉做界面,我的需要名字为Name,类型为什么的控件,你要做前台写这个控件。
我们还需加事件
protected override void OnApplyTemplate()
{
base.OnApplyTemplate();
this.remainingCharacters = this.GetTemplateChild("RemainingCharacters") as TextBlock;
this.ValidationTextBlock = this.GetTemplateChild("ValidationText") as TextBlock;
this.Update();
if (!this.IsTemplateApplied)
{
this.TextChanged += this.OnTextChanged;
this.IsEnabledChanged += this.OnIsEnabledChanged;
this.IsTemplateApplied = true;
}
}
我们设Style,没有Key,所有的控件都使用我们写的Style
我们新建一个资源,只要里面有<Style TargetType="controls:ValidatingTextBox">
我们用新建副本,直接复制TextBox的Style,不需要做什么修改。
我们在下面,修改显示
我们需要一个Head、一个显示字符数、一个验证,TextBlock
但是还记得我们约定,需要显示字符数的名字RemainingCharacters,显示验证名字ValidationText
于是我们使用布局,直接放TextBlock,于是我们的控件做好。
有一些比较难说我没有说,请去看代码 http://git.oschina.net/lindexi/WinUX-UWP-Toolkit
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
win10 uwp 验证输入 自定义用户控件的更多相关文章
- 2018-8-10-win10-uwp-验证输入-自定义用户控件
title author date CreateTime categories win10 uwp 验证输入 自定义用户控件 lindexi 2018-08-10 19:16:51 +0800 201 ...
- (九)ASP.NET自定义用户控件(2)
http://www.cnblogs.com/SkySoot/archive/2012/09/04/2670678.html 用户控件 在 .NET 里,可以通过两种方式把自己的控件插入到 Web 窗 ...
- Windows phone 自定义用户控件(UserControl)——ColorPicker
编码前 学习Windows phone自定义用户控件,在<WPF编程宝典>学习的小例子.并根据windows phone稍微的不同,做了点修改.ColorPicker(颜色拾取器):拥有三 ...
- 在Winform界面使用自定义用户控件及TabelPanel和StackPanel布局控件
在很多时候,我们做一些非常规化的界面的时候,往往需要创建一些用户控件,在其中绘制好一些基础的界面块,作为后续重复使用的一个单元,用户控件同时也可以封装处理一些简单的逻辑.在开发Winform各种类型项 ...
- (八)ASP.NET自定义用户控件(1)
http://blog.csdn.net/laodao1/article/details/5897366 ASP.NET自定义控件组件开发 第一章:从一个简单的控件谈起 起始开发ASP.NET自定义控 ...
- 浅尝辄止WPF自定义用户控件(实现颜色调制器)
主要利用用户控件实现一个自定义的颜色调制控件,实现一个小小的功能,具体实现界面如下. 首先自己新建一个wpf的用户控件类,我就放在我的wpf项目的一个文件夹下面,因为是一个很小的东西,所以就没有用mv ...
- C# 自定义用户控件
上篇:控件制作 本例是制作一个简单的自定义控件,然后用一个简单的测试程序,对于初学者来说,本例子比较简单,只能起到抛石引玉的效果.我也是在学习当中,今后会将自己所学的逐步写出来和大家交流共享. 第一步 ...
- C# winform中自定义用户控件 然后在页面中调用用户控件的事件
下面是用户控件的代码: using System; using System.Collections.Generic; using System.ComponentModel; using Syste ...
- Android自定义用户控件简单范例(二)
对于完全由后台定制的控件,并不是很方便其他人的使用,因为我们常常需要看到控件放到xml界面上的效果,并根据效果进行布局的调整,这就需要一个更加标准的控件制作流程: 我们的自定义控件和其他的控件一样,应 ...
随机推荐
- 个人作业2-英语学习案例app分析
第一部分 调研, 评测 (软件的bug,功能评测,黑箱测试, 第8章 用户调研, 12 章 软件的用户体验) 下载并使用,描述最简单直观的个人第一次上手体验. ①个人感觉还不错,词典的首页页面挺好看的 ...
- 201521123014 《Java程序设计》第8周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 泛型(编写的代码可被不同类型的对象所重用) Java中一个集合可以放任何类型的对象,因为任何对象都 is-a ...
- 201521123090 《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 参考资料: 2. 书面作业 作业参考文件下载 1.代码阅读:Child压缩包内源 ...
- 201521123037 《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结上课内容. 1.识别类.对于一个系统中,对于名词大多为类或属性,对于动词大多为方法. 2.注释.类注释.方法 ...
- 201521123019 《Java程序设计》第11周学习总结
1. 本章学习总结 2. 书面作业 Q1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥同步访 ...
- Java:final、static关键字 详解+两者结合使用
一 final关键字 1) 关于final的重要知识点 final关键字可以用于成员变量.本地变量.方法以及类. final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误. ...
- Java:java中BufferedReader的read()及readLine()方法的使用心得
BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用sock ...
- Could not execute JDBC batch update; SQL [delete from role where roleId=?]; constraint [null]; neste
今天在写多个删除功能的时候出现了这么一个错误:意思是删除操作的时候,没有找到对应的外键. Cannot delete or update a parent row: a foreign key con ...
- java 数组内的最大组合数
给定一个任意长度的java数组,求数组内的数能组合出来的最大整数比如说{9,98,123,32} 最大就是 99832123 import java.util.Arrays; import java. ...
- 如何使用Flexbox和CSS Grid,实现高效布局
CSS 浮动属性一直是网站上排列元素的主要方法之一,但是当实现复杂布局时,这种方法不总是那么理想.幸运的是,在现代网页设计时代,使用 Flexbox 和 CSS Grid 来对齐元素,变得相对容易起来 ...