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

依赖库

  • .Net Framework 4.5
  • HandyControl 3.2

网上下的一些小程序,达不到自己想要的效果,要么就是功能复杂,于是选择了自己开发。

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

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

说明

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

默认50分钟休息10分钟,按整点算(强迫症),如果工作不足10分钟,则将时间加到下一轮中。

取消整点勾选,从开始时计划

久坐提醒倒计时

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

休息提醒倒计时

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

休息到计时

从网上找的护眼图片,可以照着练练,再起来走一走。

代码说明

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

主窗体设置

这是基本框架,参考Office设计,右上解可扩展【设置】、【帮助】功能,可用于其它项目

设置工作时长、休息时长,默认从整点开始计时(有强迫症)

MainWindow.xaml

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

工作到计时

窗口倒计时时,显示在窗口右下角,

CountDown.xml

托盘图标--放在这个窗体下的原因,是因为 休息转工作时,避免托盘下会出现多个图标

<hc:NotifyIcon x:Name="NotifyIcon" Click="NotifyIconContextContent_OnClick"
Text="久坐提醒"
Visibility="Visible"
Icon="/Application.ico">
<hc:NotifyIcon.ContextMenu>
<ContextMenu>
<MenuItem Click="Settings_OnClick" Header="设置"/>
<MenuItem Click="Exit_OnClick" Header="退出"/>
</ContextMenu>
</hc:NotifyIcon.ContextMenu>
<hc:Interaction.Triggers>
<hc:EventTrigger EventName="Click">
<!--<hc:EventToCommand Command="hc:ControlCommands.PushMainWindow2Top"/>-->
</hc:EventTrigger>
</hc:Interaction.Triggers>
</hc:NotifyIcon>

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

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

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

private void Timer_OnTick(object sender, EventArgs e)
{
Remind(); //倒计时时结束,弹出休息窗口
if (_vm.CountDownWorkMinute == 0 && _vm.CountDownWorkSecond == 0)
{
_timer.Stop();
NotifyIcon.Visibility = Visibility.Hidden;
WorkBreak workBreak = new WorkBreak();
Application.Current.MainWindow = workBreak;
workBreak.DataContext = this._vm;
workBreak.InitData();
workBreak.ShowDialog();
this.Close();
return;
}
//如果分钟大于0,秒=0,那分-1,秒>0 秒-1
if (_vm.CountDownWorkMinute > 0)
{
if (_vm.CountDownWorkSecond > 0)
{
_vm.CountDownWorkSecond--;
}
else
{
_vm.CountDownWorkMinute--;
_vm.CountDownWorkSecond = 60;
}
} if (_vm.CountDownWorkMinute == 0)
{
_vm.CountDownWorkSecond--;
}
}

休息倒计时

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

WorkBreak.xaml

<base:BaseWindow x:Class="VipReminder.Views.WorkBreak"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:base="clr-namespace:Base.Base"
mc:Ignorable="d" KeyDown="WorkBreak_OnKeyDown"
Title="WorkBreak" Height="450" Width="800">
<DockPanel Background="#00a54f">
<DockPanel Dock="Bottom" >
<TextBlock HorizontalAlignment="Center" Margin="5" Style="{StaticResource TextBlockLargeBold}" Foreground="White">
<TextBlock.Text>
<MultiBinding StringFormat="{}{0:0#}:{1:0#}">
<Binding Path="CountDownBreakMinute" />
<Binding Path="CountDownBreakSecond" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DockPanel>
<DockPanel Dock="Left">
<Image Source="/Styles/Images/001.jpg"/>
</DockPanel>
<DockPanel Dock="Right">
<Image Source="/Styles/Images/002.jpg"/>
</DockPanel>
</DockPanel>
</base:BaseWindow>

WorkBreak.xaml.cs

namespace VipReminder.Views
{
/// <summary>
/// WorkBreak.xaml 的交互逻辑
/// </summary>
public partial class WorkBreak
{ // 定时器
private DispatcherTimer _timer; public VmReminder _vm; public WorkBreak()
{
InitializeComponent();
WindowState = WindowState.Maximized; //全屏显示
ShowInTaskbar = false; //任务栏不显示图标
Topmost = true; //窗体最前端显示
//this.countDown = countDown; == TODO CountDown 单例
} private void WorkBreak_OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)//Esc键
{
OpenCountDown();
}
} private void OpenCountDown()
{
CountDown countDown = new CountDown();
Application.Current.MainWindow = countDown;
countDown.DataContext = this._vm;
countDown.InitData();
countDown.Show();
_timer.Stop();
this.Close();
} public void InitData()
{
_vm = DataContext as VmReminder; this.ShowInTaskbar = false; //任务栏不显示图标 _vm.CountDownBreakMinute = _vm.BreakValue;
_vm.CountDownBreakSecond = 0; _timer = new DispatcherTimer();
_timer.Tick += Timer_OnTick;
_timer.Interval = TimeSpan.FromSeconds(1);
_timer.Start(); //KeyboardBlocker.off();//锁键盘
} private void Timer_OnTick(object sender, EventArgs e)
{
//倒计时时结束,弹出休息窗口
if (_vm.CountDownBreakMinute == 0 && _vm.CountDownBreakSecond == 0)
{
_timer.Stop();
OpenCountDown();
return;
}
//如果分钟大于0,秒=0,那分-1,秒>0 减秒
if (_vm.CountDownBreakMinute > 0)
{
if (_vm.CountDownBreakSecond > 0)
{
_vm.CountDownBreakSecond--;
}
else
{
_vm.CountDownBreakMinute--;
_vm.CountDownBreakSecond = 60;
}
} if (_vm.CountDownBreakMinute == 0)
{
_vm.CountDownBreakSecond--;
}
} }
}

源码

源码地址:https://gitee.com/VipSoft/Reminder

你们眼睛干涩,胀痛吗?C# WPF 久坐提醒桌面小程序的更多相关文章

  1. WPF简介:VS创建桌面应用程序

    1.简介 1/ 什么是WPF WPF,Windows Presentation Foundation也,译过来就是"Windows呈现基础",你看它的目的非常明确,就是用来把数据& ...

  2. wpf 客户端【JDAgent桌面助手】开发详解(四) popup控件的win8.0的bug

    目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...

  3. VSTO学习笔记(七)基于WPF的Excel分析、转换小程序

    原文:VSTO学习笔记(七)基于WPF的Excel分析.转换小程序 近期因为工作的需要,要批量处理Excel文件,于是写了一个小程序,来提升工作效率. 小程序的功能是对Excel进行一些分析.验证,然 ...

  4. wpf 客户端【JDAgent桌面助手】开发详解(三) 瀑布流效果实现与UI虚拟化优化大数据显示

    目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...

  5. wpf 客户端【JDAgent桌面助手】业余开发的终于完工了。。晒晒截图

    目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...

  6. wpf 客户端【JDAgent桌面助手】开发详解-开篇

    上周二 发表了一个帖子:wpf 客户端[JDAgent桌面助手]业余开发的终于完工了..晒晒截图... 没有想到不到一个周时间已经浏览量过8千,估计过几天就过万了..很开心啊.. 评论中好多网友问我要 ...

  7. wpf 客户端【JDAgent桌面助手】开发详解(一)主窗口 圆形菜单

    目录区域: wpf 客户端[JDAgent桌面助手]业余开发的终于完工了..晒晒截图wpf 客户端[JDAgent桌面助手]开发详解-开篇 内容区域: 这里开始主窗口 圆形菜单制作的过程,首先请大家看 ...

  8. wpf 客户端【JDAgent桌面助手】开发详解(二)桌面宠物制作详解

    目录区域: wpf 客户端[JDAgent桌面助手]业余开发的终于完工了..晒晒截 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]开发详解(一)主窗口 ...

  9. WPF区时浏览小程序

    在深圳已经工作了一个月了,之前做WinForm的,现在做WPF,每天加班到晚上10点,比之前累.学习新技术也是有个过程的,我就从基础的语法和 界面布局做起.这是我仿着做一个小软件. 效果图赏析 在原基 ...

  10. WPF异常捕获,并使程序不崩溃!

    原文:WPF异常捕获,并使程序不崩溃! 在.NET中,我们使用try-catch-finally来处理异常.但,当一个Exception抛出,抛出Exception的代码又没有被try包围时,程序就崩 ...

随机推荐

  1. 用tk.mybaits实现指定字段更新

    ​ 去年年底的因为业务需要需要在使用tk.mybaits框架的系统中实现指定字段的更新,可是tk.mybaits框架本身并不支持这个功能,我翻遍了CSDN和其他相关的技术相关的网站都没有找到相关的解决 ...

  2. pg数据库的备份和恢复以及sql脚本错误的解决方法

    1.备份单库单表的数据,以insert语句的方式 pg_dump -h IP -p 端口 -U 用户名 -t 表名 --inserts –f dbname.sql 数据库名 pg_dump -h 17 ...

  3. 2022-10-02:以下go语言代码能否通过编译?A: 能;B: 不能;C: 不知道。 package main import ( “fmt“ ) type worker interfa

    2022-10-02:以下go语言代码能否通过编译?A: 能:B: 不能:C: 不知道. package main import ( "fmt" ) type worker int ...

  4. 2022-02-16:将数组分割成和相等的子数组。 给定一个有 n 个整数的数组,你需要找到满足以下条件的三元组 (i, j, k) : 0 < i, i + 1 < j, j + 1 < k < n

    2022-02-16:将数组分割成和相等的子数组. 给定一个有 n 个整数的数组,你需要找到满足以下条件的三元组 (i, j, k) : 0 < i, i + 1 < j, j + 1 & ...

  5. CogSci 2017-Learning to reinforcement learn

    Key 元学习系统(监督+从属)扩展于RL设置 LSTM用强化学习算法进行训练,可以使agent获得一定的学习适应能力 解决的主要问题 DRL受限于特定的领域 DRL训练需要大量的数据 作者参考了Ho ...

  6. 基于Quartz的可视化UI操作组件GZY.Quartz.MUI更新说明(附:在ABP中集成GZY.Quartz.MUI可视化操作组件)

    前言 时隔2年.(PS:其实陆陆续续在优化,不过没发博客).. .本组件又迎来了新的更新... 很久没更新博客了.生了娃,换了工作单位,太忙了..实在抱歉 NET Core 基于Quartz的UI可视 ...

  7. docker容器中下载vim指令的速度特别慢,解决方案

    1 首先要进入容器内执行,保存目前源 mv /etc/apt/sources.list /etc/apt/sources.list.bak 2修改源,由于docker默认没有vim的包 所以无法使用v ...

  8. rest framwork 4 分页功能

    分页功能: 常遇到问题,当数据记录超过1000万条,如何进行分页显示问题,这时就考虑分页功能, restframework 分页实现有三种 第一种:看n页,每页显示n条数据: PageNumberPa ...

  9. JS和Document

    对象1.new var obj = new Object(); 2.函数声明对象 function Human () {}: 3.var obj = {}; 大括号 就是对象var obj = {}; ...

  10. UpSetR 高级参数使用教程

    在<UpSetR:多数据集绘图可视化处理利器>中我们介绍了 UpSetR 的一些概念和绘图基础参数使用,今天我们来学习一下 UpSetR 的 queries 和 attribute.plo ...