WP7应用开发笔记(8) IP输入框控件

因为需要在手机上配置IP,我需要一个界面输入IP地址,虽然直接使用TextBox,但是这样不太友好,我希望能够有和Windows网络设置上一样的IP输入框。所以决定写一个自定义控件。

 

设计控件外观

4个TextBox和3个显示“.”的TextBlock就可以了,结构很简单:

 

XAML代码如下:

 

<StackPanel Orientation="Horizontal" Height="72" >
<TextBox x:Name="TextOctet1"/>
<TextBlock Text="." />
<TextBox x:Name="TextOctet2"/>
<TextBlock Text="." />
<TextBox x:Name="TextOctet3"/>
<TextBlock Text="." />
<TextBox x:Name="TextOctet4"/>
</StackPanel>

因为IP地址里面只有数字和“.”,而且每位地址最长为3。为了限制输入将样式设置如下:

    <UserControl.Resources>
<Style TargetType="TextBox">
<Setter Property="Width" Value="90"/>
<Setter Property="MaxLength" Value="3"/>
<Setter Property="TextAlignment" Value="Right"/>
<Setter Property="InputScope" Value="Number"/>
</Style>
<Style TargetType="TextBlock">
<Setter Property="Margin" Value="5,30,5,0"/>
</Style>
</UserControl.Resources>

 InputScope设置为Number,限制输入数字和.。

InputScope

复习一下WP里面有一个叫做InputScope的依赖属性,这个是软输入面板设置 在WP里面非常有用的属性。支持的名称和功能如下:

受 Silverlight for Windows Phone 支持
AddressCity 城市地址的文本输入模式。

受 Silverlight for Windows Phone 支持
AddressCountryName 国家/地区的名称的文本输入模式。

受 Silverlight for Windows Phone 支持
AddressCountryShortName 国家/地区的缩写名称的文本输入模式。

受 Silverlight for Windows Phone 支持
AddressStateOrProvince 省/市/自治区的文本输入模式。

受 Silverlight for Windows Phone 支持
AddressStreet 街道地址的文本输入模式。

受 Silverlight for Windows Phone 支持
AlphanumericFullWidth 字母数字全角字符的文本输入模式。

受 Silverlight for Windows Phone 支持
AlphanumericHalfWidth 字母数字半角字符的文本输入模式。

受 Silverlight for Windows Phone 支持
ApplicationEnd 不支持。仅限在 用于 Windows Phone 的 Silverlight 中内部使用。

受 Silverlight for Windows Phone 支持
Bopomofo 汉语拼音语音转换系统的文本输入模式。

受 Silverlight for Windows Phone 支持
Chat 用于文本消息传递的 SIP 布局,可识别预定义的缩写。仅在 用于 Windows Phone 的 Silverlight 中受支持。

受 Silverlight for Windows Phone 支持
CurrencyAmount 货币数量的文本输入模式。

受 Silverlight for Windows Phone 支持
CurrencyAmountAndSymbol 货币数量和符号的文本输入模式。

受 Silverlight for Windows Phone 支持
CurrencyChinese 中国货币的文本输入模式。

受 Silverlight for Windows Phone 支持
Date 日历日期的文本输入模式。

受 Silverlight for Windows Phone 支持
DateDay 日历日期中数字日期的文本输入模式。

受 Silverlight for Windows Phone 支持
DateDayName 日历日期中日期名称的文本输入模式。

受 Silverlight for Windows Phone 支持
DateMonth 日历日期中数字月份的文本输入模式。

受 Silverlight for Windows Phone 支持
DateMonthName 日历日期中月份名称的文本输入模式。

受 Silverlight for Windows Phone 支持
DateYear 日历日期中年份的文本输入模式。

受 Silverlight for Windows Phone 支持
Default 输入命令的默认处理。

受 Silverlight for Windows Phone 支持
Digits 数字的文本输入模式。

受 Silverlight for Windows Phone 支持
EmailNameOrAddress 用于电子邮件名称或地址的 SIP 布局。仅在 用于 Windows Phone 的 Silverlight 中受支持。

受 Silverlight for Windows Phone 支持
EmailSmtpAddress 简单邮件传输协议 (SMTP) 电子邮件地址的文本输入模式。

受 Silverlight for Windows Phone 支持
EmailUserName 电子邮件用户名的文本输入模式。

受 Silverlight for Windows Phone 支持
EnumString 不支持。仅限在 用于 Windows Phone 的 Silverlight 中内部使用。

受 Silverlight for Windows Phone 支持
FileName  文件名的文本输入模式。

受 Silverlight for Windows Phone 支持
FullFilePath 文件完整路径的文本输入模式。

受 Silverlight for Windows Phone 支持
Hanja 朝鲜文汉字字符的文本输入模式。

受 Silverlight for Windows Phone 支持
Hiragana 平假名书写体系的文本输入模式。

受 Silverlight for Windows Phone 支持
KatakanaFullWidth 全角片假名字符的文本输入模式。

受 Silverlight for Windows Phone 支持
KatakanaHalfWidth 半角片假名字符的文本输入模式。

受 Silverlight for Windows Phone 支持
LogOnName 登录名的文本输入模式。

受 Silverlight for Windows Phone 支持
Maps 用于输入地图位置的 SIP 布局。仅在 用于 Windows Phone 的 Silverlight 中受支持。

受 Silverlight for Windows Phone 支持
NameOrPhoneNumber 用于 SMS“至”字段的 SIP 布局。仅在 用于 Windows Phone 的 Silverlight 中受支持。

受 Silverlight for Windows Phone 支持
Number 数字的文本输入模式。

受 Silverlight for Windows Phone 支持
NumberFullWidth 全角数字的文本输入模式。

受 Silverlight for Windows Phone 支持
OneChar 某个字符的文本输入模式。

受 Silverlight for Windows Phone 支持
Password 密码的文本输入模式。

受 Silverlight for Windows Phone 支持
PersonalFullName 个人的全名的文本输入模式。

受 Silverlight for Windows Phone 支持
PersonalGivenName 个人的名字的文本输入模式。

受 Silverlight for Windows Phone 支持
PersonalMiddleName 个人的中间名的文本输入模式。

受 Silverlight for Windows Phone 支持
PersonalNamePrefix 个人姓名前缀的文本输入模式。

受 Silverlight for Windows Phone 支持
PersonalNameSuffix 个人姓名后缀的文本输入模式。

受 Silverlight for Windows Phone 支持
PersonalSurname 个人的姓的文本输入模式。

受 Silverlight for Windows Phone 支持
PhraseList 词组列表的文本输入模式。

受 Silverlight for Windows Phone 支持
PostalAddress 邮寄地址的文本输入模式。

受 Silverlight for Windows Phone 支持
PostalCode 邮政编码的文本输入模式。

受 Silverlight for Windows Phone 支持
Private 不支持。仅限在 用于 Windows Phone 的 Silverlight 中的内部使用。

受 Silverlight for Windows Phone 支持
RegularExpression 正则表达式的文本输入模式。

受 Silverlight for Windows Phone 支持
Search 用于搜索查询的 SIP 布局。仅在 用于 Windows Phone 的 Silverlight 中受支持。

受 Silverlight for Windows Phone 支持
Srgs 语音识别语法规范 (SRGS) 的文本输入模式。

受 Silverlight for Windows Phone 支持
TelephoneAreaCode 区号的文本输入模式。

受 Silverlight for Windows Phone 支持
TelephoneCountryCode 电话的国家/地区代码的文本输入模式。

受 Silverlight for Windows Phone 支持
TelephoneLocalNumber 本地电话号码的文本输入模式。

受 Silverlight for Windows Phone 支持
TelephoneNumber 电话号码的文本输入模式。

受 Silverlight for Windows Phone 支持
Text 用于标准文本输入的软件输入面板 (SIP) 布局。仅在 用于 Windows Phone 的 Silverlight 中受支持。

受 Silverlight for Windows Phone 支持
Time 时间的文本输入模式。

受 Silverlight for Windows Phone 支持
TimeHour 小时的文本输入模式。

受 Silverlight for Windows Phone 支持
TimeMinorSec 时间的分钟或秒的文本输入模式。

受 Silverlight for Windows Phone 支持
Url 统一资源定位符 (URL) 的文本输入模式。

受 Silverlight for Windows Phone 支持
Xml XML 的文本输入模式。

受 Silverlight for Windows Phone 支持
Yomi 不支持。仅限在 用于 Windows Phone 的 Silverlight 中内部使用。

 

控件代码实现

先定义一下叫IPAddress的依赖属性,复习一下:

 public static readonly DependencyProperty IPAddressProperty =DependencyProperty.Register("IPAddress", typeof(string), typeof(IPBox),new PropertyMetadata(String.Empty, IPPropertyChangedCallback));private static void IPPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs arg){var value = (string)arg.NewValue;if (string.IsNullOrWhiteSpace(value)) return;var ipBox = (IPBox)sender;ipBox.SetIPAddress(value);}[Description("获取或设置IP")][Category("Common Properties")]public string IPAddress{get { return (string)GetValue(IPAddressProperty); }set { SetValue(IPAddressProperty, value); }}

需要实现的功能有

  • 限制输入范围为0~255
  • 输入“.”自动将焦点跳到下一个TextBox
  • 输入到3个数字的时候,自动将焦点跳到下一个TextBox
  • 按Back键如果当前TextBox没有文本,需要自动将焦点跳到前一个TextBox

 

实现这些功能需要对每个TextBox监听TextChanged和KeyDown事件,并作相应处理。

完整代码如下:

View Code
    public partial class IPBox
{
public static readonly DependencyProperty IPAddressProperty =
DependencyProperty.Register("IPAddress", typeof(string), typeof(IPBox),
new PropertyMetadata(String.Empty, IPPropertyChangedCallback));

private static void IPPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs arg)
{
var value = (string)arg.NewValue;
if (string.IsNullOrWhiteSpace(value)) return;
var ipBox = (IPBox)sender;
ipBox.SetIPAddress(value);
}

[Description("获取或设置IP")]
[Category("Common Properties")]
public string IPAddress
{
get { return (string)GetValue(IPAddressProperty); }
set { SetValue(IPAddressProperty, value); }
}

private readonly TextBox[] textBoxs;
private readonly string[] ipParts;

public IPBox()
{
InitializeComponent();

textBoxs = new[]
{
TextOctet1,
TextOctet2,
TextOctet3,
TextOctet4
};
ipParts = new string[4];
for (int i = 0; i < 4; i++)
{
var box = textBoxs[i];
box.Tag = i;
box.TextChanged += OnTextChanged;
box.KeyDown += OnKeyDown;
}
}

private void UpdateIPAddress()
{
for (int i = 0; i < 4; i++)
{
ipParts[i] = textBoxs[i].Text;
}
if (ipParts.Any(string.IsNullOrWhiteSpace)) return;
IPAddress = string.Format("{0}.{1}.{2}.{3}", TextOctet1.Text, TextOctet2.Text, TextOctet3.Text,
TextOctet4.Text);
}

private void SetIPAddress(string value)
{
IPAddress tmp;
if (!System.Net.IPAddress.TryParse(value, out tmp)) return;

string[] octets = value.Split('.');
for (int i = 0; i < 4; i++)
{
if (ipParts[i] != octets[i])
{
ipParts[i] = octets[i];
textBoxs[i].Text = octets[i];
}
}


}

private void OnTextChanged(object sender, TextChangedEventArgs e)
{
var textBox = (TextBox)sender;
var index = (int)textBox.Tag;

if (string.IsNullOrWhiteSpace(textBox.Text)) return;
if (int.Parse(textBox.Text) > 255)
{
textBox.Text = "255";
textBox.Select(3, 0);
}

if (ipParts[index] == textBox.Text) return;
if (textBox.Text.Length == 3)
{
NextFocus(index);
}
UpdateIPAddress();
}

private void OnKeyDown(object sender, KeyEventArgs e)
{
var textBox = (TextBox)sender;
if (e.PlatformKeyCode == 190) //.
{
e.Handled = true;
if (!string.IsNullOrEmpty(textBox.Text))
{
NextFocus((int)textBox.Tag);
}
return;
}
if (e.Key == Key.Back)
{
if (string.IsNullOrEmpty(textBox.Text))
{
e.Handled = true;
PrevFocus((int)textBox.Tag);
}
}
}

private void NextFocus(int index)
{
if (index >= 3) return;
var box = textBoxs[index + 1];
box.Focus();
box.Select(box.Text.Length, 0);
}

private void PrevFocus(int index)
{
if (index < 1) return;
var box = textBoxs[index - 1];
box.Focus();
box.Select(box.Text.Length, 0);
}
}


 

转载于:https://www.cnblogs.com/kiminozo/archive/2012/01/26/2329574.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#并发实战Parallel.ForEach使用

前言&#xff1a;最近给客户开发一个伙食费计算系统&#xff0c;大概需要计算2000个人的伙食。需求是按照员工的预定报餐计划对消费记录进行检查&#xff0c;如有未报餐有刷卡或者有报餐没刷卡的要进行一定的金额扣减等一系列规则。一开始我的想法比较简单&#xff0c;直接用一…

[MSDN]ASP.NET MVC2(5)MVCRoute和urls

说明&#xff1a;本内容来自微软的webcast&#xff0c;讲师为苏鹏。视频没有书方便(想看哪页就看哪页)&#xff0c;所以抄录要点和老师语录。 内容介绍 - url和routes介绍 - routes匹配url的工作方式 - 使用routes Router对象mvc运转的核心。 预备知…

一个、说到所有的扩展指标

版权声明&#xff1a;本文博客原创文章&#xff0c;博客&#xff0c;未经同意&#xff0c;不得转载。

网络通信和网络编程

一、软件结构 C/S Client/Server B/S Browser/Server 二、网络通信协议 1、协议分类 UDP 应用&#xff1a; TCP/IP 三、网络编程三要素 1、协议&#xff08;UDP、TCP/IP&#xff09; 2、IP地址 3、端口号 转载于:https://www.cnblogs.com/wmqiang/p/11333351.html

[Android] 输入系统(二)

在上一篇文章的最后&#xff0c;我们发现InputDispatcher是调用了InputChannel->sendMessage把键值发送出去&#xff0c;那么相应的&#xff0c;也有接收键值的地方。接收函数是InputChannel->receiveMessage。 在InputConsumer::consume内找到了receiveMessage&#xff…

TCP协议和套接字

一、TCP通信概述&#xff0c;逻辑连接就是三次握手 二、客户端和服务端实现TCP协议通信基本步骤 1、客户端套接字对象 Socket 2、服务端套接字ServerSocket 客户端补充完整代码&#xff1a;除了创建各自的Socket对象有关代码&#xff0c;其他代码一样&#xff0c;就输出流的输出…

齐博V7仿爱丽图库模板(含齐博图库V1.0模板)

齐博模板图片模板 本齐博模板包含两个版本&#xff0c;分别适用于齐博V7整站的图片模型模板和齐博图库程序V1版。 1、图片独立频道页设置 整站后台添加独立频道页面名称&#xff1a;图片专题 网页头部模板&#xff1a;************************ 网页中间模板&#xff1a;******…

信息安全官谁:逼近的挑战,你准备好了吗?

作为一个首席信息安全官&#xff08;CISO&#xff09;并不easy&#xff0c;一方面要时刻面对董事会提出的难题。还有一方面在处理解决公司的安全威胁时&#xff0c;又不能超出预算范围。然而首席信息安全官的资源保持不变时&#xff0c;威胁环境本身却是千变万化、日新月异。因…

【hash】Seek the Name, Seek the Fame

【哈希和哈希表】Seek the Name, Seek the Fame 题目描述 The little cat is so famous, that many couples tramp over hill and dale to Byteland, and asked the little cat to give names to their newly-born babies. They seek the name, and at the same time seek the …

WAP开发笔记(1)-.net移动页面中html控件不能直接显示的解决

最近这几天做了一些.NET移动控件的应用开发&#xff0c;与普通的asp.net页面比起来还是有点差别的。在.net移动页面中是不能直接使用普通的html控件的&#xff0c;这样给开发带来许多的不方便&#xff0c;因为感觉.net移动控件有很多功能都不能实现&#xff08;也可能是我不太熟…

BufferedInputStream学习笔记

【本文转载于http://icanfly.iteye.com/blog/1207397】 BufferedInputStream是一个带有缓冲区域的InputStream,它的继承体系如下&#xff1a; InputStream |__FilterInputStream |__BufferedInputStream首先了解一下FilterInputStream&#xff1a; FilterInputStrea…

文件上传案例——客户端和服务端套接字

一、文件上传原理 文件上传下载就是反复的输入流和输出流的read和wirte方法&#xff08;反复的内存和硬盘的交互&#xff09;&#xff1b; 二、实现 1、客户端实现&#xff1a; 2、服务端实现&#xff1a; 3、解决客户端和服务端两个程序在完成上传下载之后没有停止 原因是whil…

大家一起来博皮——2:液态布局和固态布局,页面框架篇

大家一起来博皮虽然博客园的皮肤很多&#xff0c;而且很漂亮。但是那些自己想更“个性化”自己博客皮肤的朋友&#xff0c;对博客园的皮肤模板还是颇多不满&#xff0c;认为皮肤的结构过于混乱&#xff0c;css样式难以掌控。针对这种情况&#xff0c;博客园开发团队在2007年底&…

Linux配置 DNS and BIND服务配置详解--缓存服务器配置 正反向解析配置

一、DNS简介一、DNS简介 DNS是计算机域名系统 (Domain Name System 或Domain Name Service) 的缩写&#xff0c;它是由域名解析器和域名服务器组成的。域名服务器是指保存有该网络中所有主机的域名和对应IP地址&#xff0c;并具有将域名转换为IP地址功能的服务器。其中域名必…

我的博客网站开发6——博文关键字搜索

在页面中&#xff0c;用户可以通过关键字的搜索功能搜索博文。可以实现类似百度和Google的页面搜索功能&#xff0c;可实现多个关键字的搜索。搜索后&#xff0c;在搜索的结果中有关键字的高亮度的提示如&#xff1a; 在搜索的结果页面&#xff0c;模仿Google的搜索页面的快照功…

shell 函数定义和调用

为什么80%的码农都做不了架构师&#xff1f;>>> 一. 函数定义 语法&#xff1a; [function] functionname[()]{action;[return int;] } 说明&#xff1a; 1、可以带function fun() 定义&#xff0c;也可以直接fun() 定义,不带任何参数。 2、参数返回&#xff0c;可…

Nhibernate代码生成器v2.1中文版

Nhibernate代码生成器v2.1中文版(转发)下载转载于:https://www.cnblogs.com/hakuci/archive/2008/03/15/1106802.html

Head First设计模式读书笔记——策略模式

问题描述&#xff1a; 目前的任务是实现一个FPS类游戏的各种角色&#xff08;友军、敌军、平民和狗、猫、鸭子等动物&#xff09;以及他们的各种行为&#xff08;攻击、游泳等&#xff09;。 设计方案一 很简单&#xff0c;只要实现一个角色超类&#xff0c;将角色的各种行为放…

centos+bond+bridge+docker(ssh容器)固定ip实现测试环境(一)

硬件&#xff1a;R730交换机&#xff1a;H3C Switch S5120-28P-SI系统&#xff1a;centos7#nmtuihttp://568273240.blog.51cto.com/802.3ad为LACP模式交换机部分&#xff1a;# systemctl restart network可以多重启几遍试下。http://568273240.blog.51cto.com/注意&#xff1a;…

简单线性回归算法

为什么80%的码农都做不了架构师&#xff1f;>>> /*** 简单线性回归算法* param array y轴数据* param array x轴数据* returns array(slope,intercept,r2)*/ function linearRegression(y, x) {var lr {};var n y.length;var sum_x 0;var sum_y 0;var sum_xy …