InputControls的应用

在Windows Phone 7中,存在两个输入型控件:TextBox和PasswordBox,后者在本质上其实是将TextBox的变形,在之前创建的项目中插入新的一页,名为“InputControls.xaml”,将页面名称更改为“输入控件”,之后在xaml代码区域手动书写代码来添加控件(当然也可以拖控件),添加一个TextBox和一个PasswordBox。

<!--ContentPanel - 在此处放置其他内容-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<TextBox Name="myTextBox"
Width
="300"
Height
="100"
HorizontalAlignment
="Left"
Margin
="10,60,0,450"
/>
<PasswordBox Name="myPasswordBox"
Width
="300"
Height
="100"
HorizontalAlignment
="Left"
Margin
="10,160,0,350"
/>
</Grid>

在上面的代码中,一个标签如果没有下级子标签,就使用“/>”结尾,如果有下级子标签就使用“<TextBox></TextBox>”这样的格式,其中一个Margin属性表示外边距,它的使用格式是:<frameworkElement Margin="uniform"/>或<frameworkElement Margin="left+right,top+bottom"/>或<frameworkElement Margin="left,top,right,bottom"/>,意思就是距离边框的距离,而Name属性方便我们在后台代码中使用这个控件,就像ASP.NET中的id属性一样,唯一标识一个控件,还有就是属性的设置或者事件的添加可以手动写代码,就像上面的方式,也可以在界面中选择这个控件,右键“属性”,在设计器中更改。对于Windows Phone 7的设计,可以再属性搜索框中输入属性名自动定义到属性位置,并且还具备模糊搜索,这是比较方便的一个使用,如下:

PasswordBox控件的一个重要属性就是PasswordChar属性,用来设置要替换为的密码字符,PasswordChar="#"设置为显示字符为“#”。

TextBox控件的目的就是让用户输入信息,并且可以编辑,那么它有一个很重要的属性就是InputScope,Windows Phone 7有很多不同的输入范围,比如英文键盘。数字键盘等等,要想更改这个属性,可以直接修改InputScope属性,如:

                     InputScope="TelephoneNumber"

也可以在<TextBox>标签下使用<TextBox.InputScope>子标签,那么就必须将<TextBox>完整为<TextBox></TextBox>,之后设置<InputScope>的<InputScopeName>的值,如:

                <TextBox.InputScope>
<InputScope>
<InputScopeName NameValue="TelephoneNumber"/>
</InputScope>
</TextBox.InputScope>

将其更改为电话号码的形式,另外有一个办法可以获取这个InputScope的列表,在System.Reflection命名空间(这个命名空间包含通过检查托管代码中程序集、模块、成员、参数和其他实体的元数据来检索其相关信息的类型。 这些类型还可用于操作加载类型的实例,例如挂钩事件或调用方法。)中,一个名为FieldInfo的类,这个类发现字段特性并提供对字段元数据的访问权,方法为:

        FieldInfo[] array = typeof(InputScopeNameValue).GetFields(BindingFlags.Public|BindingFlags.Static);

我们可以试着通过一个按钮点击事件来更改TextBox的InputScope的值,在学习Button之前就从工具箱中托一个Button控件,添加一个Click事件,来更改TextBox的InputScope,为了不涉及到其它为学到的知识,就使用Random来产生一个介于0到array.Length之间的随机数,随机设置InputScope的值,但是代码怎么实现呢?这一个下午都没搞出个名堂,还是去提问吧。有了结果会在这里补充的。

终于经过各种折腾,找到了解决方法,将取得的array[i]值的Name属性就可以拿到输入范围的名称,但是必须转换为InputScopeNameValue枚举类型,方法是这样的:

(InputScopeNameValue)Enum.Parse(typeof(InputScopeNameValue), array[i].Name.ToString(), false);//false表示区分大小写

另外,在写程序的时候千万不要把库中的类型名称拿来用作自己的类名,虽然这些都明白,但有些时候就犯错了,就像InputScope是在System.Windows.Input命名空间下的,如果你在项目中无意间创建了一个InputScope的类,那在接下来的代码中绞尽脑汁都不会知道错在哪里,就算是花费再长时间都找不出问题所在,这也算是一点小小的经验吧。忘了截图:

.xaml代码:

<phone:PhoneApplicationPage 
x:Class="Controls.InputControls"
xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone
="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell
="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d
="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc
="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily
="{StaticResource PhoneFontFamilyNormal}"
FontSize
="{StaticResource PhoneFontSizeNormal}"
Foreground
="{StaticResource PhoneForegroundBrush}"
SupportedOrientations
="Portrait" Orientation="Portrait"
mc:Ignorable
="d" d:DesignHeight="768" d:DesignWidth="480"
shell:SystemTray.IsVisible
="True">

<!--LayoutRoot 是包含所有页面内容的根网格-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>

<!--TitlePanel 包含应用程序的名称和页标题-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock x:Name="ApplicationTitle" Text="我的应用程序" Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock x:Name="PageTitle" Text="输入控件" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>

<!--ContentPanel - 在此处放置其他内容-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<TextBox Name="myTextBox"
Width
="300"
Height
="100"
HorizontalAlignment
="Left"
Margin
="10,60,0,450"
>
<TextBox.InputScope>
<InputScope >
<InputScopeName x:Name="myInputScopeName" NameValue="TelephoneNumber"/>
</InputScope>
</TextBox.InputScope>
</TextBox>
<TextBox Name="myTextBox2"
Width
="300"
Height
="100"
HorizontalAlignment
="Left"
Margin
="10,160,0,350"
InputScope
="TelephoneNumber"
/>
<PasswordBox Name="myPasswordBox"
Width
="300"
Height
="100"
HorizontalAlignment
="Left"
Margin
="10,260,0,250"
PasswordChar
="#"
/>
<Button Content="更改" Height="72" HorizontalAlignment="Left" Margin="259,366,0,0" Name="button1" VerticalAlignment="Top" Width="160" Click="button1_Click" />
</Grid>
</Grid>
</phone:PhoneApplicationPage>

.cs代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.Reflection;

namespace Controls
{
public partial class InputControls : PhoneApplicationPage
{
private FieldInfo[] array;
public InputControls()
{
InitializeComponent();
array= typeof(InputScopeNameValue).GetFields(BindingFlags.Public | BindingFlags.Static);
}

private void button1_Click(object sender, RoutedEventArgs e)
{
Random myRandom = new Random();
int i = myRandom.Next(0, array.Length);
System.Windows.Input.InputScope myInputScope = new System.Windows.Input.InputScope();
InputScopeName myInputScopeName = new InputScopeName();
myInputScopeName.NameValue = (InputScopeNameValue)Enum.Parse(typeof(InputScopeNameValue), array[i].Name.ToString(), false);
myInputScope.Names.Add(myInputScopeName);
this.myTextBox.InputScope = myInputScope;
        }
    }
}

最后,想着是不是自己可以做一个简易的计算器,普通的四则运算,我是这样想的,给出两个文本框,在这里书写自己的数值,如果格式正确,自动给出答案,如果格式不正确,提示“请完成计算式”,这就要用到TextBox的TextChanged事件了,至于运算符的选择,可以用TextBlock给出,当选择后就改变它的显示的大小,给出一个tap事件。那么先来创建一个名为“四则运算”的项目,书写如下的代码:

.xaml

<phone:PhoneApplicationPage 
x:Class="四则运算.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="True">

<!--LayoutRoot 是包含所有页面内容的根网格-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>

<!--TitlePanel 包含应用程序的名称和页标题-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock x:Name="ApplicationTitle" Text="我的应用程序" Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock x:Name="PageTitle" Text="计算器" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>

<!--ContentPanel - 在此处放置其他内容-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<TextBlock Name="myTextBlock" Height="54" HorizontalAlignment="Left"
VerticalAlignment="Top" Width="309" Margin="147,8,0,0"
/>
<TextBox Height="77" Width="302" HorizontalAlignment="Left"
VerticalAlignment="Top" Margin="0,60,0,0"
Name="myTextBox1" TextChanged="myTextBox_TextChanged"
TextWrapping="Wrap" FontSize="22"
>
<TextBox.InputScope>
<InputScope>
<InputScopeName NameValue="Number"/>
</InputScope>
</TextBox.InputScope>
</TextBox>
<TextBox Height="77" Width="302" HorizontalAlignment="Left"
VerticalAlignment="Top" Margin="147,269,0,0"
Name="myTextBox2" TextChanged="myTextBox_TextChanged"
TextWrapping="Wrap" FontSize="22"
>
<TextBox.InputScope>
<InputScope>
<InputScopeName NameValue="Number"/>
</InputScope>
</TextBox.InputScope>
</TextBox>
</Grid>
<Canvas Height="120" HorizontalAlignment="Left" Margin="21,143,0,0" Name="myCanvas" VerticalAlignment="Top" Width="437" Grid.Row="1">
<TextBlock Height="110" Name="add" Width="110" Text="" FontSize="56" FontWeight="Bold" TextAlignment="Center" Tap="text_Tap" Canvas.Left="0" Canvas.Top="6" />
<TextBlock Height="110" Name="minus" Width="110" Text="" FontSize="56" FontWeight="Bold" TextAlignment="Center" Tap="text_Tap" Canvas.Left="109" Canvas.Top="6" />
<TextBlock Height="110" Name="multiply" Width="110" Text="×" FontSize="56" FontWeight="Bold" TextAlignment="Center" Tap="text_Tap" Canvas.Left="221" Canvas.Top="6" />
<TextBlock Height="110" Name="divide" Width="110" Text="÷" FontSize="56" FontWeight="Bold" TextAlignment="Center" Tap="text_Tap" Canvas.Left="334" Canvas.Top="6" />
</Canvas>
</Grid>


</phone:PhoneApplicationPage>

.cs代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;

namespace 四则运算
{
public partial class MainPage : PhoneApplicationPage
{
private string flag = "test";
private double a ;
private double b ;
private double result;
private string resultStr;

// 构造函数
public MainPage()
{
InitializeComponent();
}

private void myTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
//如果两个操作数一者为空则表示出错
if (this.myTextBox1.Text != "" && this.myTextBox2.Text != "")
{
//转换为double
if (!(double.TryParse(this.myTextBox1.Text, out a) && double.TryParse(this.myTextBox2.Text, out b)))
{
//转换失败
this.myTextBlock.Text = "请输入正确的操作数";
return;
}
else
{
//开始计算
Calculate();
}
}
}

private void text_Tap(object sender, GestureEventArgs e)
{
//获取所点击的TextBlock的Text的值
TextBlock textBlock = (TextBlock)sender;
flag = textBlock.Text;
ChangeFontSize();
}

//改变字体大小,以显示用户选择的操作符
private void ChangeFontSize()
{
Canvas canvas = myCanvas;//获取画布
var collection=myCanvas.Children;
foreach(var item in collection)
{
if(item.GetType()==typeof(TextBlock))
{
TextBlock test=(TextBlock)item;
if (test.Text == flag)
{
//设置字体为72
((TextBlock)(myCanvas.FindName(test.Name))).FontSize = 72;
//进行计算
Calculate();
}
else
{
//设置字体为56
((TextBlock)(myCanvas.FindName(test.Name))).FontSize = 56;
}
}
}
}

//计算
private void Calculate()
{
switch (flag)
{
case "":
result = a + b;
resultStr = result.ToString();
break;
case "":
result = a - b;
resultStr = result.ToString();
break;
case "×":
result = a * b;
resultStr = result.ToString();
break;
case "÷": if (b != 0)
{
result = a / b;
resultStr = result.ToString();
}
else
{
resultStr = "除数不能为0";
}
break;
case "test": resultStr = "请选择操作符";
break;
}
this.myTextBlock.Text = resultStr.ToString();
}
}
}

截图:

在写后台代码的时候,要考虑到用户首先点操作符还是首先输入数字,每一种可能都要做出相应的处理。

这篇博客就写完了,这是第一次在首页上发,这些只是自己的学习过程,小生已经做好了挨拍的准备。以后会努力的。

posted on 2012-04-02 19:23  WaitingSky  阅读(531)  评论(0编辑  收藏  举报