WP7應用開發之------秒表計時器


  今天做了個秒表計時器的應用程序,實現計時,暫停,刷新等簡單功能!界面截圖如下:

 (起始主界面)

(開始計時界面)

(單擊設置時,選擇顯示的種類界面)

(顯示秒的計時界面)

(顯示毫秒的計時界面)

  該應用程序的開發思想是:主機面放一個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++什么的?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM