今天做了个秒表计时器的应用程序,实现计时,暂停,刷新等简单功能!界面截图如下:
(起始主界面)
(开始计时界面)
(单击设置时,选择显示的种类界面)
(显示秒的计时界面)
(显示毫秒的计时界面)
该应用程序的开发思想是:主机面放一个TextBlock显示时间,一个ToggleButton负责开始和停止,一个Border里面放置3个RadioButton和2个Button。Border开始时隐藏,当单击appbar的设置按钮时显示,显示后选择一个样式,单击OK,更新TextBlock的显示方式!
开发过程:
1:定义一个枚举,用来设置秒表显示类型。
public enum ElapsedTimeFormat { HourMinuteSecond, Seconds, Milliseconds }
2:App.xaml.cs文件,定义一个属性ElapsedTimeFormat,和2个方法SaveSettings,LoadSettings,用于向独立存储中保存信息和加载信息。并且在应用程序启用、激活、关闭和墓碑的时候调用。
public ElapsedTimeFormat ElapsedTimeFormat { get; set; } private void SaveSettings() { var settings = IsolatedStorageSettings.ApplicationSettings; settings["elapsedTimeFormat"] = ElapsedTimeFormat; settings.Save(); } private void LoadSettings() { var settings = IsolatedStorageSettings.ApplicationSettings; if (settings.Contains("elapsedTimeFormat")) { ElapsedTimeFormat = (ElapsedTimeFormat)settings["elapsedTimeFormat"]; } else { ElapsedTimeFormat = ElapsedTimeFormat.HourMinuteSecond; } }
3:在MainPage.xaml文件添加控件,设计样式:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Grid VerticalAlignment="Center" Margin="25 0"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBlock Name="elapsedText" Text="0" Grid.Row="0" FontFamily="Arial" FontSize="{StaticResource PhoneFontSizeExtraLarge}" TextAlignment="Center" Margin="0 0 0 50"/> <ToggleButton Name="startStopToggle" Content="Start" Grid.Row="1" Checked="startStopToggle_Checked" Unchecked="startStopToggle_Checked"/> <Rectangle Name="disableRect" Fill="#80000000" Visibility="Collapsed"/> <Border Name="formatDialog" Background="{StaticResource PhoneChromeBrush}" BorderBrush="{StaticResource PhoneForegroundBrush}" BorderThickness="3" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <StackPanel Name="radioButtonPanel" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Center"> <RadioButton Content="Hour/Minute/Seconds" Tag="HourMinuteSecond"/> <RadioButton Content="Seconds" Tag="Seconds"/> <RadioButton Content="Milliseconds" Tag="Milliseconds"/> </StackPanel> <Button Grid.Row="1" Grid.Column="0" Content="OK" Click="OnOkClick"/> <Button Grid.Row="1" Grid.Column="1" Content="Calcel" Click="OnCancelClick"/> </Grid> </Border> </Grid> </Grid>
4:添加Images文件夹和appbar.feature.settings.rest.png、appbar.refresh.rest.png文件。
5:添加AppBar并设置:
<shell:ApplicationBar IsVisible="True" IsMenuEnabled="True"> <shell:ApplicationBarIconButton IconUri="/Images/appbar.feature.settings.rest.png" Text="format" Click="AppBarFormatClick"/> <shell:ApplicationBarIconButton IconUri="/Images/appbar.refresh.rest.png" Text="reset" Click="AppBarResetClick"/> </shell:ApplicationBar>
6:书写后台代码和事件处理程序:
public partial class MainPage : PhoneApplicationPage { Stopwatch stopWatch = new Stopwatch(); TimeSpan suspensionAdjustment = new TimeSpan(); string decimalSeparator = NumberFormatInfo.CurrentInfo.NumberDecimalSeparator; // 构造函数 public MainPage() { InitializeComponent(); DisplayTime(); } void DisplayTime() { TimeSpan elapsedTime = stopWatch.Elapsed + suspensionAdjustment; string str = null; switch ((Application.Current as App).ElapsedTimeFormat) { case ElapsedTimeFormat.HourMinuteSecond: str = string.Format("{0:F2} {1:D2} {2:D2}{3}{4:D2}", elapsedTime.Hours, elapsedTime.Minutes, elapsedTime.Seconds, decimalSeparator, elapsedTime.Milliseconds / 10); break; case ElapsedTimeFormat.Seconds: str = string.Format("{0:F2} sec", elapsedTime.TotalSeconds); break; case ElapsedTimeFormat.Milliseconds: str = string.Format("{0:F0} msec", elapsedTime.TotalMilliseconds); break; } elapsedText.Text = str; } private void startStopToggle_Checked(object sender, RoutedEventArgs e) { if ((bool)startStopToggle.IsChecked) { stopWatch.Start(); startStopToggle.Content = "Stop"; CompositionTarget.Rendering += CompositionTarget_Rendering; } else { stopWatch.Stop(); startStopToggle.Content = "Start"; CompositionTarget.Rendering -= CompositionTarget_Rendering; } } void CompositionTarget_Rendering(object sender, EventArgs e) { DisplayTime(); } private void AppBarFormatClick(object sender, EventArgs e) { disableRect.Visibility = System.Windows.Visibility.Visible; formatDialog.Visibility = System.Windows.Visibility.Visible; ElapsedTimeFormat curFormat = (Application.Current as App).ElapsedTimeFormat; foreach (var child in radioButtonPanel.Children) { RadioButton radio = child as RadioButton; ElapsedTimeFormat radioFormat = (ElapsedTimeFormat)Enum.Parse(typeof(ElapsedTimeFormat), radio.Tag as string, true); radio.IsChecked = curFormat == radioFormat; } } private void AppBarResetClick(object sender, EventArgs e) { stopWatch.Reset(); startStopToggle.IsChecked = false; suspensionAdjustment = new TimeSpan(); DisplayTime(); } private void OnOkClick(object sender, RoutedEventArgs e) { foreach (var child in radioButtonPanel.Children) { RadioButton radio = child as RadioButton; if ((bool)radio.IsChecked) { (Application.Current as App).ElapsedTimeFormat = (ElapsedTimeFormat)Enum.Parse(typeof(ElapsedTimeFormat), radio.Tag as string, true); } } OnCancelClick(sender, e); } private void OnCancelClick(object sender, RoutedEventArgs e) { disableRect.Visibility = System.Windows.Visibility.Collapsed; formatDialog.Visibility = System.Windows.Visibility.Collapsed; DisplayTime(); } protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) { PhoneApplicationService service = PhoneApplicationService.Current; service.State["stopWatchRunning"] = (bool)startStopToggle.IsChecked; service.State["suspensionAdjustment"] = suspensionAdjustment + stopWatch.Elapsed; service.State["tombstoneBeginTime"] = DateTime.Now; base.OnNavigatedFrom(e); } protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { PhoneApplicationService service = PhoneApplicationService.Current; if (service.State.ContainsKey("stopWatchRunning")) { suspensionAdjustment = (TimeSpan)service.State["suspensionAdjustment"]; if ((bool)service.State["stopWatchRunning"]) { suspensionAdjustment += DateTime.Now - (DateTime)service.State["tombstoneBeginTime"]; startStopToggle.IsChecked = true; } else { DisplayTime(); } } base.OnNavigatedTo(e); } }
这就是简单的秒表计时器应用程序,有不足之处还望指点一二。
PS:谁知道WP8出来之后是用什么语言开发呀,还是XAML+C#还是C++什么的?