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里面非常有用的屬性。支持的名稱和功能如下:
AddressCity 城市地址的文本輸入模式。
AddressCountryName 國家/地區的名稱的文本輸入模式。
AddressCountryShortName 國家/地區的縮寫名稱的文本輸入模式。
AddressStateOrProvince 省/市/自治區的文本輸入模式。
AddressStreet 街道地址的文本輸入模式。
AlphanumericFullWidth 字母數字全角字符的文本輸入模式。
AlphanumericHalfWidth 字母數字半角字符的文本輸入模式。
ApplicationEnd 不支持。僅限在 用于 Windows Phone 的 Silverlight 中內部使用。
Bopomofo 漢語拼音語音轉換系統的文本輸入模式。
Chat 用于文本消息傳遞的 SIP 布局,可識別預定義的縮寫。僅在 用于 Windows Phone 的 Silverlight 中受支持。
CurrencyAmount 貨幣數量的文本輸入模式。
CurrencyAmountAndSymbol 貨幣數量和符號的文本輸入模式。
CurrencyChinese 中國貨幣的文本輸入模式。
Date 日歷日期的文本輸入模式。
DateDay 日歷日期中數字日期的文本輸入模式。
DateDayName 日歷日期中日期名稱的文本輸入模式。
DateMonth 日歷日期中數字月份的文本輸入模式。
DateMonthName 日歷日期中月份名稱的文本輸入模式。
DateYear 日歷日期中年份的文本輸入模式。
Default 輸入命令的默認處理。
Digits 數字的文本輸入模式。
EmailNameOrAddress 用于電子郵件名稱或地址的 SIP 布局。僅在 用于 Windows Phone 的 Silverlight 中受支持。
EmailSmtpAddress 簡單郵件傳輸協議 (SMTP) 電子郵件地址的文本輸入模式。
EmailUserName 電子郵件用戶名的文本輸入模式。
EnumString 不支持。僅限在 用于 Windows Phone 的 Silverlight 中內部使用。
FileName? 文件名的文本輸入模式。
FullFilePath 文件完整路徑的文本輸入模式。
Hanja 朝鮮文漢字字符的文本輸入模式。
Hiragana 平假名書寫體系的文本輸入模式。
KatakanaFullWidth 全角片假名字符的文本輸入模式。
KatakanaHalfWidth 半角片假名字符的文本輸入模式。
LogOnName 登錄名的文本輸入模式。
Maps 用于輸入地圖位置的 SIP 布局。僅在 用于 Windows Phone 的 Silverlight 中受支持。
NameOrPhoneNumber 用于 SMS“至”字段的 SIP 布局。僅在 用于 Windows Phone 的 Silverlight 中受支持。
Number 數字的文本輸入模式。
NumberFullWidth 全角數字的文本輸入模式。
OneChar 某個字符的文本輸入模式。
Password 密碼的文本輸入模式。
PersonalFullName 個人的全名的文本輸入模式。
PersonalGivenName 個人的名字的文本輸入模式。
PersonalMiddleName 個人的中間名的文本輸入模式。
PersonalNamePrefix 個人姓名前綴的文本輸入模式。
PersonalNameSuffix 個人姓名后綴的文本輸入模式。
PersonalSurname 個人的姓的文本輸入模式。
PhraseList 詞組列表的文本輸入模式。
PostalAddress 郵寄地址的文本輸入模式。
PostalCode 郵政編碼的文本輸入模式。
Private 不支持。僅限在 用于 Windows Phone 的 Silverlight 中的內部使用。
RegularExpression 正則表達式的文本輸入模式。
Search 用于搜索查詢的 SIP 布局。僅在 用于 Windows Phone 的 Silverlight 中受支持。
Srgs 語音識別語法規范 (SRGS) 的文本輸入模式。
TelephoneAreaCode 區號的文本輸入模式。
TelephoneCountryCode 電話的國家/地區代碼的文本輸入模式。
TelephoneLocalNumber 本地電話號碼的文本輸入模式。
TelephoneNumber 電話號碼的文本輸入模式。
Text 用于標準文本輸入的軟件輸入面板 (SIP) 布局。僅在 用于 Windows Phone 的 Silverlight 中受支持。
Time 時間的文本輸入模式。
TimeHour 小時的文本輸入模式。
TimeMinorSec 時間的分鐘或秒的文本輸入模式。
Url 統一資源定位符 (URL) 的文本輸入模式。
Xml XML 的文本輸入模式。
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
總結
以上是生活随笔為你收集整理的WP7应用开发笔记(8) IP输入框控件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《仙剑奇侠传七》PS4/PS5版本今日正
- 下一篇: [MSDN]ASP.NET MVC2(5