构建横向布局的WP7应用程序

最新的Windows Phone 7构建工具除了免费的Express SKU外,也支持Visual Studio 2010了,本文就以我开发的一个小费计算器为例,为大家介绍一下如何在Visual Studio 2010环境下,构建一个支持横向布局的Windows Phone 7应用程序。首先来看看纵向布局时的样子:550904_201007011417431.jpg

 

  图 1 纵向布局的小费计算器

  布局

  从上图可以看出,程序布局分为三部分,包括了数字键,小费比例调整键和账单金额汇总信息。550904_201007011417432.jpg

 

  图 2 程序布局:从上到下分为三部分

  每个网格都对应Grid.Row属性的一行,注意第一个格子对应第0行,第二个格子对应第1行,第三个格子对应第2行。

  当用户旋转手机时,我们希望程序布局也进行调整,以匹配新的维度,实现起来其实也很简单,首先在LayoutRoot添加一列,作为汇总数字显示区域。550904_201007011417433.jpg

 

  图 3 从纵向布局切换到横向布局的变化

手机旋转到横向模式时,我们把TotalsGrid移到第二列,紧邻NumbersGrid,要实现这个效果,首先LayoutRoot需要有三行两列来容纳这些内容。

 


"LayoutRoot" Background="{StaticResource PhoneBackgroundBrush}">
    
         "Auto"/>
         "Auto"/>
         "*"/>
    

    
         "Auto" />
         "0" x:Name="LandscapeColumn" />
    

  前两个Height属性都设为“Auto”RowDefinition元素表示它们只会占据所容纳内容需要的高度,第三个RowDefinition元素的Height属性设为“*”,表示高度不限,要多少占多少。

  第一个ColumnDefinition元素的Width属性设为“Auto”,表示它的宽度会根据所容纳内容自动进行调整,第二个ColumnDefinition元素的Width属性设为“0”,这是因为在纵向模式时这一列(LandscapeColumn)是不显示的。

  为了同时支持横向和纵向模式,应用程序必须声明它支持,然后再处理方向变化事件:

 

SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape;

this.OrientationChanged +=
new EventHandler(MainPage_OrientationChanged);

 

当方向变化时,我们首先将TotalsGrid移到紧邻NumbersGrid的第二列中去,然后对列的属性做相应的修改:

void MainPage_OrientationChanged(object sender, OrientationChangedEventArgs e)

  {

  // In landscape mode, the totals grid is moved to the right on the screen

  // which puts it in row 1, column 1.

  if ((e.Orientation & PageOrientation.Landscape) != 0)

  {

  LandscapeColumn.Width = GridLength.Auto;

  Grid.SetRow(TotalsGrid, 1);

  Grid.SetColumn(TotalsGrid, 1);

  LayoutRoot.ColumnDefinitions.Width = GridLength.Auto;

  }

  // In portrait mode, the totals grid goes below the number pad at the

  // bottom of the screen which is row 0, column 2.

  else

  {

  LandscapeColumn.Width = new GridLength(0);

  Grid.SetRow(TotalsGrid, 2);

  Grid.SetColumn(TotalsGrid, 0);

  LayoutRoot.ColumnDefinitions.Width = new GridLength(0);

  }

  }

 

最后横向模式的显示效果如下:550904_201007011417434.jpg

 

  图 4 横向模式显示效果

按钮处理程序

  数字按钮是通过xaml配置文件将所有项目放在3x4的小格子中实现的,每个数字按钮使用“button”命名,其中x表示该按钮对应的数字。当一个按钮按下时,将这个按钮代表的数字添加到账单数量上,我们可以在Visual Studio 2010中手工添加处理代码,也可以使用C#匿名委托功能实现更多的功能。

 

 

private void InitButtonHandlers()

  {

  for (int i = 0; i <= 9; i++)

  {

  string btnName = "button" + i.ToString();

  System.Windows.Controls.Button btn =

  (System.Windows.Controls.Button)this.LayoutRoot.FindName(btnName);

  int j = i; // avoid local variable capture

  btn.Click += new RoutedEventHandler(

  (object sender, RoutedEventArgs e) => { TryUpdateBillAmount(textBlockBill.Text + j.ToString()); }

  );

  }

  }

通过这个循环语句使用名字找到所有按钮,然后分别添加处理程序,下面是最有趣的代码部分:550904_201007011417435.jpg

 

  图 5 按钮事件处理程序

  这串代码为每个按钮实例定义了一个按钮处理程序,方法定义以(object sender, RoutedEventArgs e)参数列表开头,紧接着是Lambda语法符号==>,然后就是方法实现{ TryUpdateBillAmount(textBlockBill.Text + j.ToString()); }

  每按一下按钮,代码就获得当前的字符串值,追加这个数字到末尾,然后调用TryUpdateBillAmount方法确定是否要更新结果值。

  注意其中的int j = i; // avoid local variable capture,局部变量i被看作是一个外部变量,这意味着i可以在堆上获得地址空间,而不是在栈上,不会包含每个循环的值(如果你在委托中使用i,在这个例子中,你获得的值将总是10),为了解决这个问题,我们在循环中声明了一个局部变量j,并捕获它的值。

  用模拟器进行调试

  调试也很简单,只需要在Visual Studio 2010中按F5即可,默认情况下,模拟器就是你的目标。550904_201007011417436.jpg

 

  图 6 调试时,默认的目标就是模拟器

  如果你有一部Windows Phone 7手机,通过USB将它与你的计算机连接,然后就可以将目标改为Windows Phone 7设备。550904_201007011417437.jpg

 

  图 7 调整调试目标为Windows Phone 7设备

  现在就可以使用Visual Studio的调式器和模拟器测试应用程序了,例如,想要测试横向模式时,只需选择你要旋转的方向:550904_201007011417438.jpg

 

  图 8 选择横向进行测试

  小结

  本文使用到的都是SilverlightC#常见的技术,通过这个例子,我只想告诉大家,其实你之前掌握的SilverlightC#技术一样可以用于Windows Phone 7应用程序的开发

 

fj.png1.JPG

fj.png2.JPG

fj.png3.JPG

fj.png4.JPG

fj.png5.JPG

fj.png6.JPG

fj.png7.JPG

fj.png8.JPG

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/550904/viewspace-666823/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/550904/viewspace-666823/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值