InputControls的应用
2012-04-02 19:23
169 查看
在Windows Phone 7中,存在两个输入型控件:TextBox和PasswordBox,后者在本质上其实是将TextBox的变形,在之前创建的项目中插入新的一页,名为“InputControls.xaml”,将页面名称更改为“输入控件”,之后在xaml代码区域手动书写代码来添加控件(当然也可以拖控件),添加一个TextBox和一个PasswordBox。
在上面的代码中,一个标签如果没有下级子标签,就使用“/>”结尾,如果有下级子标签就使用“<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属性,如:
也可以在<TextBox>标签下使用<TextBox.InputScope>子标签,那么就必须将<TextBox>完整为<TextBox></TextBox>,之后设置<InputScope>的<InputScopeName>的值,如:
将其更改为电话号码的形式,另外有一个办法可以获取这个InputScope的列表,在System.Reflection命名空间(这个命名空间包含通过检查托管代码中程序集、模块、成员、参数和其他实体的元数据来检索其相关信息的类型。 这些类型还可用于操作加载类型的实例,例如挂钩事件或调用方法。)中,一个名为FieldInfo的类,这个类发现字段特性并提供对字段元数据的访问权,方法为:
我们可以试着通过一个按钮点击事件来更改TextBox的InputScope的值,在学习Button之前就从工具箱中托一个Button控件,添加一个Click事件,来更改TextBox的InputScope,为了不涉及到其它为学到的知识,就使用Random来产生一个介于0到array.Length之间的随机数,随机设置InputScope的值,但是代码怎么实现呢?这一个下午都没搞出个名堂,还是去提问吧。有了结果会在这里补充的。
终于经过各种折腾,找到了解决方法,将取得的array[i]值的Name属性就可以拿到输入范围的名称,但是必须转换为InputScopeNameValue枚举类型,方法是这样的:
另外,在写程序的时候千万不要把库中的类型名称拿来用作自己的类名,虽然这些都明白,但有些时候就犯错了,就像InputScope是在System.Windows.Input命名空间下的,如果你在项目中无意间创建了一个InputScope的类,那在接下来的代码中绞尽脑汁都不会知道错在哪里,就算是花费再长时间都找不出问题所在,这也算是一点小小的经验吧。忘了截图:
.xaml代码:
.cs代码
最后,想着是不是自己可以做一个简易的计算器,普通的四则运算,我是这样想的,给出两个文本框,在这里书写自己的数值,如果格式正确,自动给出答案,如果格式不正确,提示“请完成计算式”,这就要用到TextBox的TextChanged事件了,至于运算符的选择,可以用TextBlock给出,当选择后就改变它的显示的大小,给出一个tap事件。那么先来创建一个名为“四则运算”的项目,书写如下的代码:
.xaml
.cs代码
截图:
在写后台代码的时候,要考虑到用户首先点操作符还是首先输入数字,每一种可能都要做出相应的处理。
这篇博客就写完了,这是第一次在首页上发,这些只是自己的学习过程,小生已经做好了挨拍的准备。以后会努力的。
<!--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(); } } }
截图:
在写后台代码的时候,要考虑到用户首先点操作符还是首先输入数字,每一种可能都要做出相应的处理。
这篇博客就写完了,这是第一次在首页上发,这些只是自己的学习过程,小生已经做好了挨拍的准备。以后会努力的。
相关文章推荐
- Dart.Powerweb.livecontrols应用
- Android4.0 input事件输入流程详解(中间层到应用层)
- android应用私有存储文件的写入与读取-openFileInput 和 openFileOutput
- linux驱动由浅入深系列:输入子系统之一(input子系统概述、应用层读取event)
- Android 按键流程(InputManagerService 以及 JNI phoneWindowManger 应用)(and5.1)
- 关于IEWebControls的安装及一些应用
- Android应用私有存储文件的写入与读取-openFileInput 和 openFileOutput
- html input高级应用
- Mapreduce中的RCFile输入RCFileInputFormat实现及其应用
- input特殊事件应用的例子
- Android4.0 input事件输入流程详解(中间层到应用层)
- RadControls 主题在 Silverlight中的应用
- input标签的hidden属性的应用及作用
- 基于DragonBoard 410c的input设备应用层编程
- Linux系统下Libinput驱动的应用(主要在触摸屏校准)
- HTML input文本框 高级应用
- Input事件输入系统之应用MotionEvent触摸事件处理流程
- input子系统应用层(一)
- php 应用 bootstrap-fileinput 上传文件 插件 操作的方法
- Jquery - 调整Input标签的宽度并应用grid将input和button并排一行