Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6642633
  • 博文数量: 915
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8846
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(915)

文章存档

2022年(9)

2021年(13)

2020年(10)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: Android平台

2019-08-11 14:59:23

入口属性和活动
除了从InputView继承Keyboard属性之外,Entry还定义了另外四个属性,其中只有一个属性在上一个程序中看到:

  • Text - 条目中显示的字符串
  • TextColor - 颜色值
  • IsPassword - 一种布尔值,可以在输入字符后立即屏蔽字符
  • Placeholder - 条目中显示的浅色文本,但在用户开始输入后立即消失。

通常,程序通过访问Text属性来获取用户键入的内容,但程序也可以初始化Text属性。 也许程序希望建议一些文本输入。
Entry还定义了两个事件:

  • TextChanged
  • Completed

Text属性的每次更改都会触发TextChanged事件,这通常对应于每次击键(shift和一些特殊键除外)。 程序可以监视此事件以执行有效性检查。 例如,您可以检查有效数字或有效电子邮件地址以启用“计算”或“发送”按钮。
当用户按下键盘上的特定键以指示文本已完成时,将触发Completed事件。 此密钥是特定于平台的:

  • iOS:密钥标记为return,不在电话或数字键盘上。
  • Android:键是键盘右下角的绿色复选标记。
  • WindowsPhone:键是大多数键盘上的输入(或返回)符号(?),但在Url键盘上是一个符号(→)。 电话和数字键板上没有这样的键。

在iOS和Android上,完成的键除了生成Completed事件外还会解除键盘。 在Windows 10 Mobile上它没有。
Android和Windows用户也可以使用纵向屏幕左下角的手机“后退”按钮来关闭键盘。 这会导致Entry失去输入焦点,但不会导致Completed事件触发。
让我们编写一个名为QuadraticEquations的程序来求解二次方程,它是以下形式的方程式:
axx + bx + c = 0
对于任何三个常数a,b和c,程序使用二次方程求解x:
x = (-b + sqrt(b*b-4ac)/2a) 或者
x = (-b - sqrt(b*b-4ac)/2a)
在三个Entry视图中输入a,b和c,然后按一个标记为Solve for x的按钮。
这是XAML文件。 不幸的是,数字键盘不适合这个程序,因为在所有三个平台上它都不允许输入负数。 因此,没有指定特定的键盘:


点击(此处)折叠或打开

  1. <ContentPage xmlns=""
  2.              xmlns:x=""
  3.              x:Class="QuadaticEquations.QuadraticEquationsPage">
  4.     <ContentPage.Resources>
  5.         <ResourceDictionary>
  6.             <Style TargetType="Label">
  7.                 <Setter Property="FontSize" Value="Medium" />
  8.                 <Setter Property="VerticalOptions" Value="Center" />
  9.             </Style>
  10.             <Style TargetType="Entry">
  11.                 <Setter Property="WidthRequest" Value="180" />
  12.             </Style>
  13.         </ResourceDictionary>
  14.     </ContentPage.Resources>
  15.     <StackLayout>
  16.         <!-- Entry section -->
  17.         <StackLayout Padding="20, 0, 0, 0"
  18.                      VerticalOptions="CenterAndExpand"
  19.                      HorizontalOptions="Center">
  20.             <StackLayout Orientation="Horizontal">
  21.                 <Entry x:Name="entryA"
  22.                        TextChanged="OnEntryTextChanged"
  23.                        Completed="OnEntryCompleted" />
  24.                 <Label Text=" x² +" />
  25.             </StackLayout>
  26.             <StackLayout Orientation="Horizontal">
  27.                 <Entry x:Name="entryB"
  28.                        TextChanged="OnEntryTextChanged"
  29.                        Completed="OnEntryCompleted" />
  30.                 <Label Text=" x +" />
  31.             </StackLayout>
  32.             <StackLayout Orientation="Horizontal">
  33.                 <Entry x:Name="entryC"
  34.                        TextChanged="OnEntryTextChanged"
  35.                        Completed="OnEntryCompleted" />
  36.                 <Label Text=" = 0" />
  37.             </StackLayout>
  38.         </StackLayout>
  39.  
  40.         <!-- Button -->
  41.         <Button x:Name="solveButton"
  42.                 Text="Solve for x"
  43.                 FontSize="Large"
  44.                 IsEnabled="False"
  45.                 VerticalOptions="CenterAndExpand"
  46.                 HorizontalOptions="Center"
  47.                 Clicked="OnSolveButtonClicked" />
  48.         <!-- Results section -->
  49.         <StackLayout VerticalOptions="CenterAndExpand"
  50.                      HorizontalOptions="Center">
  51.             <Label x:Name="solution1Label"
  52.                    HorizontalTextAlignment="Center" />
  53.             <Label x:Name="solution2Label"
  54.                    HorizontalTextAlignment="Center" />
  55.         </StackLayout>
  56.     </StackLayout>
  57. </ContentPage>

标签,条目和按钮视图分为三个部分:顶部的数据输入,中间的按钮和底部的结果。请注意隐式Style条目中特定于平台的WidthRequest设置。这使每个条目的宽度为1英寸。
该程序提供了两种触发计算的方法:按键盘上的完成键,或按页面中间的按钮。这样的程序中的另一个选项是执行每次击键的计算(或者更准确,每个TextChanged
事件)。这可以在这里工作,因为重新计算非常快。但是,在本设计中,结果位于屏幕底部附近,并且在虚拟键盘处于活动状态时被覆盖,因此必须重新组织页面以使这种方案有意义。
QuadraticEquations程序使用TextChanged事件,但仅用于确定键入每个条目的文本的有效性。文本传递给Double.TryParse,如果方法返回false,则Entry文本显示为红色。 (在Windows 10 Mobile上,只有当Entry失去输入焦点时才会显示红色文本。)此外,仅当所有三个Entry视图都包含有效的double值时,才会启用Button。这是显示所有程序交互的代码隐藏文件的前半部分:

点击(此处)折叠或打开

  1. public partial class QuadraticEquationsPage : ContentPage
  2. {
  3.     public QuadraticEquationsPage()
  4.     {
  5.         InitializeComponent();
  6.         // Initialize Entry views.
  7.         entryA.Text = "1";
  8.         entryB.Text = "-1";
  9.         entryC.Text = "-1";
  10.     }
  11.     void OnEntryTextChanged(object sender, TextChangedEventArgs args)
  12.     {
  13.         // Clear out solutions.
  14.         solution1Label.Text = " ";
  15.         solution2Label.Text = " ";
  16.         // Color current entry text based on validity.
  17.         Entry entry = (Entry)sender;
  18.         double result;
  19.         entry.TextColor = Double.TryParse(entry.Text, out result) ? Color.Default : Color.Red;
  20.         // Enable the button based on validity.
  21.         solveButton.IsEnabled = Double.TryParse(entryA.Text, out result) &&
  22.                                 Double.TryParse(entryB.Text, out result) &&
  23.                                 Double.TryParse(entryC.Text, out result);
  24.     }
  25.     void OnEntryCompleted(object sender, EventArgs args)
  26.     {
  27.         if (solveButton.IsEnabled)
  28.         {
  29.             Solve();
  30.         }
  31.     }
  32.     void OnSolveButtonClicked(object sender, EventArgs args)
  33.     {
  34.         Solve();
  35.     }
  36.  __
  37. }

Entry的Completed处理程序仅在启用Button时调用Solve方法,(如您所见)表示所有三个Entry视图都包含有效值。 因此,Solve方法可以安全地假设所有三个Entry视图都包含有效数字,这些数字不会导致Double.Parse引发异常。
Solve方法必然复杂,因为二次方程可能有一个或两个解,每个解可能有一个虚部和一个实部。 该方法将第二个解决方案的实际部分初始化为Double.NaN(“非数字”),并且只有在不再是这种情况时才显示第二个结果。 仅当虚部非零时才显示虚部,并且加号或短划线(Unicode u2013)连接实部和虚部:

点击(此处)折叠或打开

  1. public partial class QuadraticEquationsPage : ContentPage
  2. {
  3.     __
  4.     void Solve()
  5.     {
  6.         double a = Double.Parse(entryA.Text);
  7.         double b = Double.Parse(entryB.Text);
  8.         double c = Double.Parse(entryC.Text);
  9.         double solution1Real = 0;
  10.         double solution1Imag = 0;
  11.         double solution2Real = Double.NaN;
  12.         double solution2Imag = 0;
  13.         string str1 = " ";
  14.         string str2 = " ";
  15.         
  16.         if (a == 0 && b == 0 && c == 0)
  17.         {
  18.             str1 = "x = anything";
  19.         }
  20.         else if (a == 0 && b == 0)
  21.         {
  22.             str1 = "x = nothing";
  23.         }
  24.         else
  25.         {
  26.             if (a == 0)
  27.             {
  28.                 solution1Real = -c / b;
  29.             }
  30.             else
  31.             {
  32.                 double discriminant = b * b - 4 * a * c;
  33.                 if (discriminant == 0)
  34.                 {
  35.                     solution1Real = -b / (2 * a);
  36.                 }
  37.                 else if (discriminant > 0)
  38.                 {
  39.                     solution1Real = (-b + Math.Sqrt(discriminant)) / (2 * a);
  40.                     solution2Real = (-b - Math.Sqrt(discriminant)) / (2 * a);
  41.                 }
  42.                 else
  43.                 {
  44.                     solution1Real = -b / (2 * a);
  45.                     solution2Real = solution1Real;
  46.                     solution1Imag = Math.Sqrt(-discriminant) / (2 * a);
  47.                     solution2Imag = -solution1Imag;
  48.                 }
  49.             }
  50.             str1 = Format(solution1Real, solution1Imag);
  51.             str2 = Format(solution2Real, solution2Imag);
  52.         }
  53.         solution1Label.Text = str1;
  54.         solution2Label.Text = str2;
  55.     }
  56.     string Format(double real, double imag)
  57.     {
  58.         string str = " ";
  59.         if (!Double.IsNaN(real))
  60.         {
  61.             str = String.Format("x = {0:F5}", real);
  62.             if (imag != 0)
  63.             {
  64.                 str += String.Format(" {0} {1:F5} i",
  65.                                      Math.Sign(imag) == 1 ? "+" : "\u2013",
  66.                                      Math.Abs(imag));
  67.             }
  68.         }
  69.         return str;
  70.     }
  71. }

以下是几个解决方案:
2018_09_19_162726
阅读(1130) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~