今天做了個秒表計時器的應用程序,實現計時,暫停,刷新等簡單功能!界面截圖如下:
(起始主界面)
(開始計時界面)
(單擊設置時,選擇顯示的種類界面)
(顯示秒的計時界面)
(顯示毫秒的計時界面)
該應用程序的開發思想是:主機面放一個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++什么的?