使用 Visual Studio 2008 建立 WPF 專案,體驗 XAML 宣告式 UI 與傳統 WinForms 差異。實作一個置頂、螢幕置中、紅色大字體的倒數計時器。
App.xaml / App.xaml.cs:應用程式進入點MainWin.xaml / MainWin.xaml.cs:主視窗 UI 與邏輯ProcessCount.cs:倒數邏輯類別
ProcessCount.cs - 封裝倒數邏輯:
public class ProcessCount {
private int _TotalSecond;
public ProcessCount(int totalSecond) { _TotalSecond = totalSecond; }
public bool ProcessCountDown() { if (_TotalSecond == 0) return false; _TotalSecond--; return true; }
public string GetHour() => string.Format("{0:D2}", _TotalSecond / 3600);
public string GetMinute() => string.Format("{0:D2}", (_TotalSecond % 3600) / 60);
public string GetSecond() => string.Format("{0:D2}", _TotalSecond % 60);
}
MainWin.xaml - 透明背景、無邊框、Grid 佈局:
<Window ... WindowStyle="None" Background="Transparent" AllowsTransparency="True" WindowStartupLocation="CenterScreen" Topmost="True">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition /><ColumnDefinition Width="40"/><ColumnDefinition /><ColumnDefinition Width="40"/><ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Name="HourArea" Text="00" FontSize="180" Background="Red" VerticalAlignment="Center" Grid.Column="0"/>
<TextBlock Name="HourSplitMinute" Text=":" FontSize="180" Background="Red" VerticalAlignment="Center" Grid.Column="1"/>
<TextBlock Name="MinuteArea" Text="10" FontSize="180" Background="Red" VerticalAlignment="Center" Grid.Column="2"/>
<TextBlock Name="MinuteSplitSecond" Text=":" FontSize="180" Background="Red" VerticalAlignment="Center" Grid.Column="3"/>
<TextBlock Name="SecondArea" Text="00" FontSize="180" Background="Red" VerticalAlignment="Center" Grid.Column="4"/>
</Grid>
</Window>
MainWin.xaml.cs - DispatcherTimer 每秒觸發更新 UI:
public partial class MainWin : Window {
private DispatcherTimer timer;
private ProcessCount processCount;
public delegate bool CountDownHandler();
public event CountDownHandler CountDown;
public MainWin() { InitializeComponent(); Loaded += MainWin_Loaded; }
private void MainWin_Loaded(object sender, RoutedEventArgs e) {
timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
timer.Tick += timer_Tick;
int totalSec = Convert.ToInt32(HourArea.Text)*3600 + Convert.ToInt32(MinuteArea.Text)*60 + Convert.ToInt32(SecondArea.Text);
processCount = new ProcessCount(totalSec);
CountDown += processCount.ProcessCountDown;
timer.Start();
}
private void timer_Tick(object sender, EventArgs e) {
if (OnCountDown()) { HourArea.Text = processCount.GetHour(); MinuteArea.Text = processCount.GetMinute(); SecondArea.Text = processCount.GetSecond(); }
else timer.Stop();
}
public bool OnCountDown() => CountDown?.Invoke() ?? false;
}
註解完整,適合 WPF 初學者參考。