[WP7][修練][VB.NET] 來個練習題:生理時鐘大挑戰

前面兩篇修練,一篇是【Timer 撰寫簡單的時鐘範例】,另一篇是【指定不同的鍵盤模式輸入】。這一篇就來做個範例做個練習。我們來做個【生理時鐘大挑戰】的小小遊戲作為練習。內容相當簡單,設定要挑戰的秒數。按下開始後,由自己內心默數,默數時間到了,按下停止。來看看實際用掉的秒數與設定的秒數差異到底有多少。以下就來做這個示範。

緣起

前面兩篇修練,一篇是【Timer 撰寫簡單的時鐘範例】,另一篇是【指定不同的鍵盤模式輸入】。這一篇就來做個範例做個練習。我們來做個【生理時鐘大挑戰】的小小遊戲作為練習。內容相當簡單,設定要挑戰的秒數。按下開始後,由自己內心默數,默數時間到了,按下停止。來看看實際用掉的秒數與設定的秒數差異到底有多少。以下就來做這個示範。

 

畫面的安排

剛開始的第一個設計,先簡單化的處理,未來可以考慮把一些設定的項目、說明的描述等,改到另外設定的頁面去,讓畫面可以更簡潔(這個部份表過不提)。

BT001

秒數設定:用來設定要默數的秒數。利用上一篇的鍵盤設定,可以設定輸入鍵盤時,用Number來方便手機操作時可以快速輸入數字。

提示開關:剛開始默數練習時,可以把提示開關打開,這樣可以練習了解秒數的頻率,幫助我們真正默數時可以有大概的感覺。這會設定提示的抬頭、提示的秒數這兩個控制項的顯示與隱藏。

按鈕:他會有開始→停止→再試一次三種狀態的輪替。

結果:會顯示默數的秒數,以及與您設定的秒數差異。

相關的畫面程式碼如下:


<!--TitlePanel 包含應用程式的名稱和頁面標題-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
    <TextBlock x:Name="ApplicationTitle" Text="生理時鐘大挑戰" Style="{StaticResource PhoneTextNormalStyle}"/>
    <TextBlock x:Name="PageTitle" Text="生理時鐘" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>

<!--ContentPanel - 其他內容置於此-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <TextBlock Height="49" HorizontalAlignment="Left" Margin="10,10,0,0" Name="tbRuleTi" Text="規則說明:" VerticalAlignment="Top" FontSize="32" />
    <TextBlock Height="147" HorizontalAlignment="Left" Margin="35,71,0,0" Name="tbRule" Text="設定預計要默數的秒數,按下開始後,心裡默署指定的秒數,等時間到的時候,按下停止。系統會顯示您真正用的時間,以及與您所設定的時間誤差多少。" VerticalAlignment="Top" Width="392" TextWrapping="Wrap" />
    <TextBlock Height="44" HorizontalAlignment="Left" Margin="12,195,0,0" Name="tbSecSetTi" Text="秒數設定:" VerticalAlignment="Top" FontSize="26" />
    <TextBox HorizontalAlignment="Left"  Name="txtSeconds" Text="10" VerticalAlignment="Top" Margin="148,179,0,0" Width="79" TextAlignment="Right" >
        <TextBox.InputScope>
            <InputScope>
                <InputScopeName NameValue="Number" />
            </InputScope>
        </TextBox.InputScope>
    </TextBox>

    <toolkit:ToggleSwitch Header="" Height="103" HorizontalAlignment="Left" Margin="0,243,0,0" Name="ToggleSwitch1" VerticalAlignment="Top" Width="307" FontSize="26" Content="提示開關:關" />
    <TextBlock FontSize="26" Height="44" HorizontalAlignment="Left" Margin="279,269,0,0" Name="TextBlock4" Text="開" VerticalAlignment="Top" />
    <Button Content="開始" Height="129" HorizontalAlignment="Left" Margin="7,311,0,0" Name="btn" VerticalAlignment="Top" Width="438" />
    <TextBlock Height="50" HorizontalAlignment="Left" Margin="12,436,0,0" Name="tbTiDemo" Text="提示:" VerticalAlignment="Top" FontSize="26" Visibility="Collapsed" />
    <TextBlock Height="47" HorizontalAlignment="Center" Margin="159,436,163,0" Name="tbDemo" Text="00.0" VerticalAlignment="Top" Visibility="Collapsed" TextAlignment="Center" FontSize="26" Width="134" />
    <TextBlock Height="50" HorizontalAlignment="Left" Margin="12,492,0,0" Name="tbTiRlt" Text="結果:" VerticalAlignment="Top" FontSize="26" Visibility="Collapsed" />
    <TextBlock FontSize="26" Height="50" HorizontalAlignment="Left" Margin="87,492,0,0" Name="tbRlt" Text="00.0" TextAlignment="Center" VerticalAlignment="Top" Visibility="Collapsed" Width="358" />
</Grid>

相關程式碼:

相關的程式碼小喵貼在下面,小喵盡量的註解了。程式算簡單,按鈕來啟動與停止Timer的Trick。

當啟動的時候記錄啟動的時間;當Trick的時候,就已Trick的時間減啟動時間。得到經過的時間。

相關程式請參考如下:


Imports System.Windows.Threading
Imports Microsoft.Phone.Controls

Partial Public Class MainPage
    Inherits PhoneApplicationPage

    Private WithEvents tmr As New DispatcherTimer

    Private StartTime As DateTime       '用以記錄開始的時間
    Private RunType As String = "Init"  '用以記錄執行的型態
    Private ShowTime As String = ""     '用以記錄要顯示的運行的秒數

    ' 建構函式
    Public Sub New()
        InitializeComponent()
    End Sub

    Private Sub txtSeconds_GotFocus(sender As Object, e As System.Windows.RoutedEventArgs) Handles txtSeconds.GotFocus
        '當焦點在Textbox的時候,讓裡面的內容選取起來,方便使用者簡易操作,可以直接輸入
        Me.txtSeconds.SelectAll()
    End Sub

    '自己撰寫一個OnTimerTick的Sub,並且設定Hadles tmr的Tick事件
    Private Sub OnTimerTick(ByVal sender As Object, ByVal args As EventArgs) Handles tmr.Tick
        '當Timer Tick的時候,計算目前的時間與初始時間的差距
        Dim UseTime As TimeSpan = DateTime.Now - StartTime
        '透過ToString, format取得要顯示的內容
        ShowTime = UseTime.ToString("ss\.f")
        If Me.tbDemo.Visibility = Windows.Visibility.Visible Then
            '如果有顯示示範,就將計算後的秒數差顯示
            Me.tbDemo.Text = ShowTime
        End If
    End Sub

    Private Sub ToggleSwitch1_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles ToggleSwitch1.Click
        If Me.ToggleSwitch1.IsChecked = True Then
            '顯示示範
            Me.tbDemo.Visibility = Windows.Visibility.Visible
            Me.tbTiDemo.Visibility = Windows.Visibility.Visible
        Else
            '隱藏示範
            Me.tbDemo.Visibility = Windows.Visibility.Collapsed
            Me.tbTiDemo.Visibility = Windows.Visibility.Collapsed
        End If
    End Sub

    Private Sub MainPage_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
        '設定每經過0.1秒觸發一次Tick
        tmr.Interval = TimeSpan.FromSeconds(0.1)
    End Sub

    Private Sub btn_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btn.Click
        '判斷目前的狀態,進入下一個狀態(初始→執行→停止→初始)
        Select Case RunType
            Case "Init"
                '**從【初始狀態】→進入【運行狀態】
                StartTime = DateTime.Now
                tmr.Start()
                Me.btn.Content = "停止"
                RunType = "Run"
                ShowTime = ""

            Case "Run"
                '**從【運行狀態】→進入【停止狀態】
                tmr.Stop()
                Me.btn.Content = "再試一次"
                RunType = "Stop"
                Me.tbTiRlt.Visibility = Windows.Visibility.Visible
                Me.tbRlt.Visibility = Windows.Visibility.Visible
                Dim DiffCnt As Double = CDbl(ShowTime) - CInt(Me.txtSeconds.Text)
                Me.tbRlt.Text = ShowTime & "," & "您的差異值為【" & DiffCnt.ToString("#0.#") & "】"

            Case "Stop"
                '**從【停止狀態】→進入【初始狀態】
                Me.tbDemo.Text = "00.0"
                ShowTime = ""
                Me.tbTiRlt.Visibility = Windows.Visibility.Collapsed
                Me.tbRlt.Text = "00.0"
                Me.tbRlt.Visibility = Windows.Visibility.Collapsed
                Me.btn.Content = "開始"
                RunType = "Init"

        End Select
    End Sub
End Class

總結

這個小小的遊戲算是牛刀小試,程式的邏輯也相當簡單,剛好作為上兩篇【Timer 撰寫簡單的時鐘範例】與【指定不同的鍵盤模式輸入】的練習。後續再來將依些設定、畫面說明放到另外一頁,讓畫面可以更簡化。分享給大家。

^_^


以下是簽名:


Microsoft MVP
Visual Studio and Development Technologies
(2005~2019/6) 
topcat
Blog:http://www.dotblogs.com.tw/topcat