经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
你们眼睛干涩,胀痛吗?C# WPF 久坐提醒桌面小程序 - 内附 眼肌运动、远视力表高清图
来源:cnblogs  作者:VipSoft  时间:2023/8/9 9:15:33  对本文有异议


久坐提醒桌面小程序: 干这行职业病比较多,之前用爱丽(即:玻璃酸钠滴眼液),用的时候挺舒服,缓解吧,不过治标不治本。
注意休息,加强锻炼非常有必要,每工作1小时,休息10分钟(程序中有锁键盘鼠标的功能,那个太狠了,万一领导要东西电脑锁住了尴尬了,被我注释了),看看远方,办公桌上放盘绿值,没事的时候看看,站个桩,或者高架马步,马步扎得好,到老疾病少,不过注意别把膝盖搞坏了,我玩得狠现在有积液了 ??

八段锦真的不错,可以练练,B站上选那种带呼吸版的

网上下的一些小程序,达不到自己想要的效果,要么就是功能复杂,于是选择了自己开发。
图片来源于给小孩买的挂贴,贴墙上看的。于是自己网上找了图片当成锁屏图片使用了。稍微看看,总比一起盯着代码要好,不建议长时间看,那样的话眼睛还是没离开显示器,久坐提醒主要是提醒起来走走动动

采用WPF 基于HandyControl 开发的小程序。

  1. 有2年不写WPF开发了,练练手
  2. 平时工作一坐就是半天,眼睛不怎么好了,干眼严重

说明

设置提醒时间,及休息时间

默认50分钟休息10分钟,按整点算(强迫症),如果工作不足10分钟,则将时间加到下一轮中。
取消整点勾选,从开始时计划
image

久坐提醒倒计时

开始后右下角有小球球,显示倒计时,像360那样的窗口悬停吸附不知道怎么做,没继续研究
image

休息提醒倒计时

距休息10秒时,窗体会显示到最上层,同时字体颜色变为黄色
image

休息到计时

从网上找的护眼图片,可以照着练练,再起来走一走。按ESC退出 或者时间到了继续下一轮倒计时
不建议看的时间太长,因为那样的话,你的眼睛还是没有离开电脑
image

代码说明

设置界面、倒计时、休息界面,三个页面,通过 VmReminder 进行数据共享
依赖库

  • .Net Framework 4.5
  • HandyControl 3.2

主窗体设置

这是基本框架,参考Office设计,右上解可扩展【设置】、【帮助】功能,可用于其它项目
设置工作时长、休息时长,默认从整点开始计时(有强迫症)

MainWindow.xaml

  1. private void BtnStart_OnClick(object sender, RoutedEventArgs e)
  2. {
  3. _vm.IsHourly = chkHourly.IsChecked.HasValue && chkHourly.IsChecked.Value;
  4. _vm.WorkValue = (int)numWork.Value;
  5. _vm.BreakValue = (int)numBreak.Value;
  6. //开始后,调用倒计时窗体,并将倒计时窗体设为主窗体,否则点拖盘图标,会弹出设置窗体
  7. CountDown countDown = new CountDown();
  8. countDown.DataContext = this._vm;
  9. countDown.InitData();
  10. Application.Current.MainWindow = countDown;
  11. countDown.Show();
  12. this.Close();
  13. }

工作到计时

窗口倒计时时,显示在窗口右下角,
CountDown.xml
托盘图标--放在这个窗体下的原因,是因为 休息转工作时,避免托盘下会出现多个图标

  1. <hc:NotifyIcon x:Name="NotifyIcon" Click="NotifyIconContextContent_OnClick"
  2. Text="久坐提醒"
  3. Visibility="Visible"
  4. Icon="/Application.ico">
  5. <hc:NotifyIcon.ContextMenu>
  6. <ContextMenu>
  7. <MenuItem Click="Settings_OnClick" Header="设置"/>
  8. <MenuItem Click="Exit_OnClick" Header="退出"/>
  9. </ContextMenu>
  10. </hc:NotifyIcon.ContextMenu>
  11. <hc:Interaction.Triggers>
  12. <hc:EventTrigger EventName="Click">
  13. <!--<hc:EventToCommand Command="hc:ControlCommands.PushMainWindow2Top"/>-->
  14. </hc:EventTrigger>
  15. </hc:Interaction.Triggers>
  16. </hc:NotifyIcon>

WPF StringFormat="{}{0:0#}:{1:0#}" 显示倒计时,格式化,如果个位数时,前面补0

  1. <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" >
  2. <TextBlock HorizontalAlignment="Center" Margin="5" Style="{StaticResource TextBlockLargeBold}" Foreground="White">
  3. <TextBlock.Text>
  4. <MultiBinding StringFormat="{}{0:0#}:{1:0#}">
  5. <Binding Path="CountDownWorkMinute" />
  6. <Binding Path="CountDownWorkSecond" />
  7. </MultiBinding>
  8. </TextBlock.Text>
  9. </TextBlock>
  10. </StackPanel>
  1. /// <summary>
  2. /// 窗口显示在右下角
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void CountDown_Loaded(object sender, System.Windows.RoutedEventArgs e)
  7. {
  8. var desktopWorkingArea = System.Windows.SystemParameters.WorkArea;
  9. this.Left = desktopWorkingArea.Right - this.Width;
  10. this.Top = desktopWorkingArea.Bottom - this.Height;
  11. }

通过定时器,工作实现倒计时功能

  1. private void Timer_OnTick(object sender, EventArgs e)
  2. {
  3. Remind();
  4. //倒计时时结束,弹出休息窗口
  5. if (_vm.CountDownWorkMinute == 0 && _vm.CountDownWorkSecond == 0)
  6. {
  7. _timer.Stop();
  8. NotifyIcon.Visibility = Visibility.Hidden;
  9. WorkBreak workBreak = new WorkBreak();
  10. Application.Current.MainWindow = workBreak;
  11. workBreak.DataContext = this._vm;
  12. workBreak.InitData();
  13. workBreak.ShowDialog();
  14. this.Close();
  15. return;
  16. }
  17. //如果分钟大于0,秒=0,那分-1,秒>0 秒-1
  18. if (_vm.CountDownWorkMinute > 0)
  19. {
  20. if (_vm.CountDownWorkSecond > 0)
  21. {
  22. _vm.CountDownWorkSecond--;
  23. }
  24. else
  25. {
  26. _vm.CountDownWorkMinute--;
  27. _vm.CountDownWorkSecond = 60;
  28. }
  29. }
  30. if (_vm.CountDownWorkMinute == 0)
  31. {
  32. _vm.CountDownWorkSecond--;
  33. }
  34. }

休息倒计时

休息窗体显示两护眼张图片和一个休息到计时,按ESC时可取消本次休息,
WorkBreak.xaml

  1. <base:BaseWindow x:Class="VipReminder.Views.WorkBreak"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:base="clr-namespace:Base.Base"
  7. mc:Ignorable="d" KeyDown="WorkBreak_OnKeyDown"
  8. Title="WorkBreak" Height="450" Width="800">
  9. <DockPanel Background="#00a54f">
  10. <DockPanel Dock="Bottom" >
  11. <TextBlock HorizontalAlignment="Center" Margin="5" Style="{StaticResource TextBlockLargeBold}" Foreground="White">
  12. <TextBlock.Text>
  13. <MultiBinding StringFormat="{}{0:0#}:{1:0#}">
  14. <Binding Path="CountDownBreakMinute" />
  15. <Binding Path="CountDownBreakSecond" />
  16. </MultiBinding>
  17. </TextBlock.Text>
  18. </TextBlock>
  19. </DockPanel>
  20. <DockPanel Dock="Left">
  21. <Image Source="/Styles/Images/001.jpg"/>
  22. </DockPanel>
  23. <DockPanel Dock="Right">
  24. <Image Source="/Styles/Images/002.jpg"/>
  25. </DockPanel>
  26. </DockPanel>
  27. </base:BaseWindow>

WorkBreak.xaml.cs

  1. namespace VipReminder.Views
  2. {
  3. /// <summary>
  4. /// WorkBreak.xaml 的交互逻辑
  5. /// </summary>
  6. public partial class WorkBreak
  7. {
  8. // 定时器
  9. private DispatcherTimer _timer;
  10. public VmReminder _vm;
  11. public WorkBreak()
  12. {
  13. InitializeComponent();
  14. WindowState = WindowState.Maximized; //全屏显示
  15. ShowInTaskbar = false; //任务栏不显示图标
  16. Topmost = true; //窗体最前端显示
  17. //this.countDown = countDown; == TODO CountDown 单例
  18. }
  19. private void WorkBreak_OnKeyDown(object sender, KeyEventArgs e)
  20. {
  21. if (e.Key == Key.Escape)//Esc键
  22. {
  23. OpenCountDown();
  24. }
  25. }
  26. private void OpenCountDown()
  27. {
  28. CountDown countDown = new CountDown();
  29. Application.Current.MainWindow = countDown;
  30. countDown.DataContext = this._vm;
  31. countDown.InitData();
  32. countDown.Show();
  33. _timer.Stop();
  34. this.Close();
  35. }
  36. public void InitData()
  37. {
  38. _vm = DataContext as VmReminder;
  39. this.ShowInTaskbar = false; //任务栏不显示图标
  40. _vm.CountDownBreakMinute = _vm.BreakValue;
  41. _vm.CountDownBreakSecond = 0;
  42. _timer = new DispatcherTimer();
  43. _timer.Tick += Timer_OnTick;
  44. _timer.Interval = TimeSpan.FromSeconds(1);
  45. _timer.Start();
  46. //KeyboardBlocker.off();//锁键盘
  47. }
  48. private void Timer_OnTick(object sender, EventArgs e)
  49. {
  50. //倒计时时结束,弹出休息窗口
  51. if (_vm.CountDownBreakMinute == 0 && _vm.CountDownBreakSecond == 0)
  52. {
  53. _timer.Stop();
  54. OpenCountDown();
  55. return;
  56. }
  57. //如果分钟大于0,秒=0,那分-1,秒>0 减秒
  58. if (_vm.CountDownBreakMinute > 0)
  59. {
  60. if (_vm.CountDownBreakSecond > 0)
  61. {
  62. _vm.CountDownBreakSecond--;
  63. }
  64. else
  65. {
  66. _vm.CountDownBreakMinute--;
  67. _vm.CountDownBreakSecond = 60;
  68. }
  69. }
  70. if (_vm.CountDownBreakMinute == 0)
  71. {
  72. _vm.CountDownBreakSecond--;
  73. }
  74. }
  75. }
  76. }

源码

运行包:https://gitee.com/VipSoft/Reminder/releases/download/V1.0/Reminder.zip
源码地址:https://gitee.com/VipSoft/Reminder

高清图

眼肌运动高清图下载

点击查看高清图

原文链接:https://www.cnblogs.com/vipsoft/p/17603959.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号