今天的主要内容有
1.处理屏幕旋转的问题,使我联想到wp8自带的计算器就和这方面的内容有关,横屏与竖屏所展现出来的是不一样的。
如果只是把xaml文件里的SupportedOrientations改为LandscapeOrPortrait,这样的话当屏幕方向改变时只是死板地适应屏幕而已,甚至一些效果都会失去,所以要加入处理屏幕方向改变这样的事件处理来处理这个事件,在xaml文件属性设置里添加OrientationChanged如下所示:OrientationChanged="PhoneApplicationPage_OrientationChanged"
然后在对应页面里添加事件
privatevoidPhoneApplicationPage_OrientationChanged(objectsender,OrientationChangedEventArgs e)
{//如果屏幕方向是横向的
if(e.Orientation== PageOrientation.Landscape||e.Orientation ==PageOrientation.LandscapeLeft||e.Orientation ==PageOrientation.LandscapeRight)
{//在这里添加对应的处理方法
}
}
2.页面之间进行导航的问题,也就是不同页面之间互相切换的问题,当然还有不同页面之间传递参数的问题。
首先是页面切换的问题,有两种方法,第一种:在当前页面内添加控件hyperlinkButton,然后设置好一般的属性比如位置,大小,等等,再把NavigateUri的值设置为/page1.xaml,这里page1.xaml即为要跳转到的第二个页面
第二种:用代码的方式实现,比如说在主页面添加一个按钮,然后把这个按钮的处理处理事件设置为跳转页面的动作,则用户在点击这个按钮的时候就能够实现页面的跳转,在xaml里添加控件不用多说,主要是在页面代码里的事件:
privatevoidbutton1_Click(object sender,RoutedEventArgse)
{
this.NavigationService.Navigate(newUri("/Page1.xaml",UriKind.Relative));
}
在这里也要强调一点,在xaml里要声明Click为button1_Click,这点我调试的时候忘记了,再一个就是事件处理方法里面的内容,调用导航服务(我自己这么理解)的导航方法跳转到第二个页面
3.两个需要注意的方法
OnNavigatedFrom和OnNavigatedTo,这两个方法分别在当前页面和跳转后的页面内执行,在跳转之前要保存数据或者什么的可以写在OnNavigatedFrom里面,而在跳转到新页面之后要做什么准备工作的可以写到OnNavigatedTo这个方法里,现先这么觉得,可能也有别的方法。
4.页面之间参数传递的问题
这个应该是最重要的问题,在android开发里Activity之间传递内容时候是利用intent对象实现的,而在这里page之间传递参数的手段是在Uri里面附加上参数即可,具体代码如下:privatevoidbutton1_Click(object sender,RoutedEventArgse)
{
this.NavigationService.Navigate(newUri("/Page1.xaml?str="+textbox1.Text,UriKind.Relative));
}
在处理点击事件的时候附带参数把文本内容传递过去,在page1.cs文件里进行接收,用到刚才的那个OnNavigatedTo方法,具体代码如下:
protectedoverridevoidOnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
this.textblock1.Text= this.NavigationContext.QueryString["str"];
}
关于页面之间的导航还有几个问题需要注意,可以代码实现后退键的功能,虽然手机本身有回退键,也可以屏蔽掉系统的回退实体键,也可以消除回退历史,比如从A到B再到C,这样回退的话只能从C回退到B,然后再回退到A,我们可以直接从C回退到A,代码如下:
1. protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
2. {
3. base.OnNavigatedFrom(e);
4. PhoneApplicationFrame myFrame = Application.Current.RootVisual as PhoneApplicationFrame;
5. if (myFrame != null)
6. {
7. try
8. {
9. myFrame.RemoveBackEntry();
10. }
11. catch (InvalidOperationException ex)
12. {
13. MessageBox.Show(ex.Message);
14. }
15. }
16.
17. }
在这里,我们使用PhoneApplicationFrame类的RemoveBackEntry方法删除最新一条记录,每次只删除一条,要删除多条,就调用N次。因为导航历史记录是栈结构的,后进先出,所以,就像你拿一堆书放在桌面上一样,首先拿掉的是放在最上面的,如下图所示:从例子中看到,使用PhoneApplicationFrame类的RemoveBackEntry方法删除最新一条记录,每次只删除一条,要删除多条,就调用N次。因为导航历史记录是栈结构的,后进先出,所以,就像你拿一堆书放在桌面上一样,首先拿掉的是放在最上面的。
5.比如说这里有几个按钮,我们要给他们设定固定的样式style,我们可以一个一个地给每一个按钮设定样式,多几个ctrl+c和ctrl+v,但是这样还是很臃肿,我们可以把style封装成一个资源集合类,然后给这些按钮设置style即可,这就省去了很多代码,具体代码如下:
1. <phone:PhoneApplicationPage
2. x:Class="ResSampleApp.Page2"
3. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5. xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
6. xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
7. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
8. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
9. FontFamily="{StaticResource PhoneFontFamilyNormal}"
10. FontSize="{StaticResource PhoneFontSizeNormal}"
11. Foreground="{StaticResource PhoneForegroundBrush}"
12. SupportedOrientations="Portrait" Orientation="Portrait"
13. mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
14. shell:SystemTray.IsVisible="True">
15. <phone:PhoneApplicationPage.Resources>
16. <Style x:Key="buttonStyle" TargetType="Button">
17. <Setter Property="Background">
18. <Setter.Value>
19. <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
20. <GradientStop Color="Yellow" Offset="0"/>
21. <GradientStop Color="Red" Offset="1"/>
22. </LinearGradientBrush>
23. </Setter.Value>
24. </Setter>
25. <Setter Property="HorizontalAlignment" Value="Left"/>
26. <Setter Property="VerticalAlignment" Value="Top"/>
27. <Setter Property="Width" Value="185"/>
28. <Setter Property="Height" Value="50"/>
29. <Setter Property="BorderThickness" Value="0"/>
30. </Style>
31. </phone:PhoneApplicationPage.Resources>
32.
33. <Grid>
34. <Button Content="按钮一" Height="72" Margin="10,10,0,0" Name="button1" Style="{StaticResource buttonStyle}" />
35. <Button Content="按钮二" Height="72" Margin="10,92,0,0" Name="button2" Style="{StaticResource buttonStyle}" />
36. <Button Content="按钮三" Height="72" Margin="10,174,0,0" Name="button3" Style="{StaticResource buttonStyle}" />
37. </Grid>
38.
39.
40. </phone:PhoneApplicationPage>
开始部分和一般的xaml开头一样,都是这个页面的整体属性,关键在Phone.PhoneApplicationPage.Resources 这个资源集合里,在这里一次性地设置了相关属性,于是我们在给每个Button设置style的时候就简单多了,注意引用资源文件的方式,一对大括号里面有StaticResources,表示静态属性,那动态属性呢?好吧,这又是一个问题。这样一来,我们就省去了很多代码。这是设置后的样式: