using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; using System.Timers; using System.Media; namespace Ink_Canvas { /// /// Interaction logic for StopwatchWindow.xaml /// public partial class CountdownTimerWindow : Window { public CountdownTimerWindow() { InitializeComponent(); timer.Elapsed += Timer_Elapsed; timer.Interval = 50; } private void Timer_Elapsed(object sender, ElapsedEventArgs e) { if (!isTimerRunning || isPaused) { timer.Stop(); return; } TimeSpan timeSpan = DateTime.Now - startTime; TimeSpan totalTimeSpan = new TimeSpan(hour, minute, second); TimeSpan leftTimeSpan = totalTimeSpan - timeSpan; if (leftTimeSpan.Milliseconds > 0) leftTimeSpan += new TimeSpan(0, 0, 1); double spentTimePercent = timeSpan.TotalMilliseconds / (totalSeconds * 1000.0); Application.Current.Dispatcher.Invoke(() => { ProcessBarTime.CurrentValue = 1 - spentTimePercent; TextBlockHour.Text = leftTimeSpan.Hours.ToString("00"); TextBlockMinute.Text = leftTimeSpan.Minutes.ToString("00"); TextBlockSecond.Text = leftTimeSpan.Seconds.ToString("00"); if (spentTimePercent >= 1) { ProcessBarTime.CurrentValue = 0; TextBlockHour.Text = "00"; TextBlockMinute.Text = "00"; TextBlockSecond.Text = "00"; timer.Stop(); isTimerRunning = false; SymbolIconStart.Symbol = ModernWpf.Controls.Symbol.Play; BtnStartCover.Visibility = Visibility.Visible; TextBlockHour.Foreground = new SolidColorBrush(StringToColor("#FF5B5D5F")); BorderStopTime.Visibility = Visibility.Collapsed; } }); if (spentTimePercent >= 1) { Application.Current.Dispatcher.Invoke(() => { //Play sound player.Stream = Properties.Resources.TimerDownNotice; player.Play(); }); } } SoundPlayer player = new SoundPlayer(); int hour = 0; int minute = 1; int second = 0; int totalSeconds = 60; DateTime startTime = DateTime.Now; DateTime pauseTime = DateTime.Now; bool isTimerRunning = false; bool isPaused = false; Timer timer = new Timer(); private void Grid_MouseUp(object sender, MouseButtonEventArgs e) { if (ProcessBarTime.Visibility == Visibility.Visible && isTimerRunning == false) { ProcessBarTime.Visibility = Visibility.Collapsed; GridAdjustHour.Visibility = Visibility.Visible; TextBlockHour.Foreground = Brushes.Black; } else { ProcessBarTime.Visibility = Visibility.Visible; GridAdjustHour.Visibility = Visibility.Collapsed; TextBlockHour.Foreground = new SolidColorBrush(StringToColor("#FF5B5D5F")); if (hour == 0 && minute == 0 && second == 0) { second = 1; TextBlockSecond.Text = second.ToString("00"); } } } private void Button_Click(object sender, RoutedEventArgs e) { hour++; if (hour >= 100) hour = 0; TextBlockHour.Text = hour.ToString("00"); } private void Button_Click_1(object sender, RoutedEventArgs e) { hour += 5; if (hour >= 100) hour = 0; TextBlockHour.Text = hour.ToString("00"); } private void Button_Click_2(object sender, RoutedEventArgs e) { hour--; if (hour < 0) hour = 99; TextBlockHour.Text = hour.ToString("00"); } private void Button_Click_3(object sender, RoutedEventArgs e) { hour -= 5; if (hour < 0) hour = 99; TextBlockHour.Text = hour.ToString("00"); } private void Button_Click_4(object sender, RoutedEventArgs e) { minute++; if (minute >= 60) minute = 0; TextBlockMinute.Text = minute.ToString("00"); } private void Button_Click_5(object sender, RoutedEventArgs e) { minute += 5; if (minute >= 60) minute = 0; TextBlockMinute.Text = minute.ToString("00"); } private void Button_Click_6(object sender, RoutedEventArgs e) { minute--; if (minute < 0) minute = 59; TextBlockMinute.Text = minute.ToString("00"); } private void Button_Click_7(object sender, RoutedEventArgs e) { minute -= 5; if (minute < 0) minute = 59; TextBlockMinute.Text = minute.ToString("00"); } private void Button_Click_8(object sender, RoutedEventArgs e) { second += 5; if (second >= 60) second = 0; TextBlockSecond.Text = second.ToString("00"); } private void Button_Click_9(object sender, RoutedEventArgs e) { second++; if (second >= 60) second = 0; TextBlockSecond.Text = second.ToString("00"); } private void Button_Click_10(object sender, RoutedEventArgs e) { second--; if (second < 0) second = 59; TextBlockSecond.Text = second.ToString("00"); } private void Button_Click_11(object sender, RoutedEventArgs e) { second -= 5; if (second < 0) second = 59; TextBlockSecond.Text = second.ToString("00"); } private void Window_Loaded(object sender, RoutedEventArgs e) { ProcessBarTime.Visibility = Visibility.Visible; GridAdjustHour.Visibility = Visibility.Collapsed; BorderStopTime.Visibility = Visibility.Collapsed; } private void BtnFullscreen_MouseUp(object sender, MouseButtonEventArgs e) { if (WindowState == WindowState.Normal) { WindowState = WindowState.Maximized; SymbolIconFullscreen.Symbol = ModernWpf.Controls.Symbol.BackToWindow; } else { WindowState = WindowState.Normal; SymbolIconFullscreen.Symbol = ModernWpf.Controls.Symbol.FullScreen; } } private void BtnReset_MouseUp(object sender, MouseButtonEventArgs e) { if (!isTimerRunning) { TextBlockHour.Text = hour.ToString("00"); TextBlockMinute.Text = minute.ToString("00"); TextBlockSecond.Text = second.ToString("00"); BtnResetCover.Visibility = Visibility.Visible; BtnStartCover.Visibility = Visibility.Collapsed; BorderStopTime.Visibility = Visibility.Collapsed; TextBlockHour.Foreground = new SolidColorBrush(StringToColor("#FF5B5D5F")); return; } else if (isTimerRunning && isPaused) { TextBlockHour.Text = hour.ToString("00"); TextBlockMinute.Text = minute.ToString("00"); TextBlockSecond.Text = second.ToString("00"); BtnResetCover.Visibility = Visibility.Visible; BtnStartCover.Visibility = Visibility.Collapsed; BorderStopTime.Visibility = Visibility.Collapsed; TextBlockHour.Foreground = new SolidColorBrush(StringToColor("#FF5B5D5F")); SymbolIconStart.Symbol = ModernWpf.Controls.Symbol.Play; isTimerRunning = false; timer.Stop(); isPaused = false; ProcessBarTime.CurrentValue = 0; ProcessBarTime.IsPaused = false; } else { UpdateStopTime(); startTime = DateTime.Now; Timer_Elapsed(timer, null); } } void UpdateStopTime() { TimeSpan totalTimeSpan = new TimeSpan(hour, minute, second); TextBlockStopTime.Text = (startTime + totalTimeSpan).ToString("t"); } private Color StringToColor(string colorStr) { Byte[] argb = new Byte[4]; for (int i = 0; i < 4; i++) { char[] charArray = colorStr.Substring(i * 2 + 1, 2).ToCharArray(); //string str = "11"; Byte b1 = toByte(charArray[0]); Byte b2 = toByte(charArray[1]); argb[i] = (Byte)(b2 | (b1 << 4)); } return Color.FromArgb(argb[0], argb[1], argb[2], argb[3]);//#FFFFFFFF } private static byte toByte(char c) { byte b = (byte)"0123456789ABCDEF".IndexOf(c); return b; } private void BtnStart_MouseUp(object sender, MouseButtonEventArgs e) { if (isPaused && isTimerRunning) { //继续 startTime += DateTime.Now - pauseTime; ProcessBarTime.IsPaused = false; TextBlockHour.Foreground = Brushes.Black; SymbolIconStart.Symbol = ModernWpf.Controls.Symbol.Pause; isPaused = false; timer.Start(); UpdateStopTime(); BorderStopTime.Visibility = Visibility.Visible; } else if (isTimerRunning) { //暂停 pauseTime = DateTime.Now; ProcessBarTime.IsPaused = true; TextBlockHour.Foreground = new SolidColorBrush(StringToColor("#FF5B5D5F")); SymbolIconStart.Symbol = ModernWpf.Controls.Symbol.Play; BorderStopTime.Visibility = Visibility.Collapsed; isPaused = true; timer.Stop(); } else { //从头开始 startTime = DateTime.Now; totalSeconds = ((hour * 60) + minute) * 60 + second; ProcessBarTime.IsPaused = false; TextBlockHour.Foreground = Brushes.Black; SymbolIconStart.Symbol = ModernWpf.Controls.Symbol.Pause; BtnResetCover.Visibility = Visibility.Collapsed; if (totalSeconds <= 10) { timer.Interval = 20; } else if (totalSeconds <= 60) { timer.Interval = 30; } else if (totalSeconds <= 120) { timer.Interval = 50; } else { timer.Interval = 100; } isPaused = false; isTimerRunning = true; timer.Start(); UpdateStopTime(); BorderStopTime.Visibility = Visibility.Visible; } } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { isTimerRunning = false; } private void BtnClose_MouseUp(object sender, MouseButtonEventArgs e) { Close(); } } }