你们眼睛干涩,胀痛吗?C# WPF 久坐提醒桌面小程序
久坐提醒桌面小程序: 干这行职业病比较多,之前用爱丽(即:玻璃酸钠滴眼液),用的时候挺舒服,缓解吧,不过治标不治本。注意休息,加强锻炼非常有必要,这周开始每工作1小时,休息10分钟(程序中有锁键盘鼠标的功能,那个太狠了,万一领导要东西电脑锁住了尴尬了,被我注释了),看看远方,绿值,站个桩,或者高架马步,马步扎得好,到老疾病少,不过注意别把膝盖搞坏了,我玩得狠现在有积液了
依赖库
- .Net Framework 4.5
- HandyControl 3.2
网上下的一些小程序,达不到自己想要的效果,要么就是功能复杂,于是选择了自己开发。
采用WPF 基于HandyControl 开发的小程序。
- 有2年不写WPF开发了,练练手
- 平时工作一坐就是半天,眼睛不怎么好了,干眼严重
说明
设置提醒时间,及休息时间
默认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 久坐提醒桌面小程序的更多相关文章
- WPF简介:VS创建桌面应用程序
1.简介 1/ 什么是WPF WPF,Windows Presentation Foundation也,译过来就是"Windows呈现基础",你看它的目的非常明确,就是用来把数据& ...
- wpf 客户端【JDAgent桌面助手】开发详解(四) popup控件的win8.0的bug
目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...
- VSTO学习笔记(七)基于WPF的Excel分析、转换小程序
原文:VSTO学习笔记(七)基于WPF的Excel分析.转换小程序 近期因为工作的需要,要批量处理Excel文件,于是写了一个小程序,来提升工作效率. 小程序的功能是对Excel进行一些分析.验证,然 ...
- wpf 客户端【JDAgent桌面助手】开发详解(三) 瀑布流效果实现与UI虚拟化优化大数据显示
目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...
- wpf 客户端【JDAgent桌面助手】业余开发的终于完工了。。晒晒截图
目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...
- wpf 客户端【JDAgent桌面助手】开发详解-开篇
上周二 发表了一个帖子:wpf 客户端[JDAgent桌面助手]业余开发的终于完工了..晒晒截图... 没有想到不到一个周时间已经浏览量过8千,估计过几天就过万了..很开心啊.. 评论中好多网友问我要 ...
- wpf 客户端【JDAgent桌面助手】开发详解(一)主窗口 圆形菜单
目录区域: wpf 客户端[JDAgent桌面助手]业余开发的终于完工了..晒晒截图wpf 客户端[JDAgent桌面助手]开发详解-开篇 内容区域: 这里开始主窗口 圆形菜单制作的过程,首先请大家看 ...
- wpf 客户端【JDAgent桌面助手】开发详解(二)桌面宠物制作详解
目录区域: wpf 客户端[JDAgent桌面助手]业余开发的终于完工了..晒晒截 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]开发详解(一)主窗口 ...
- WPF区时浏览小程序
在深圳已经工作了一个月了,之前做WinForm的,现在做WPF,每天加班到晚上10点,比之前累.学习新技术也是有个过程的,我就从基础的语法和 界面布局做起.这是我仿着做一个小软件. 效果图赏析 在原基 ...
- WPF异常捕获,并使程序不崩溃!
原文:WPF异常捕获,并使程序不崩溃! 在.NET中,我们使用try-catch-finally来处理异常.但,当一个Exception抛出,抛出Exception的代码又没有被try包围时,程序就崩 ...
随机推荐
- Oracle 定时任务job实际应用
目录 一.Oracle定时任务简介 二.dbms_job涉及到的知识点 三.初始化相关参数job_queue_processes 四.实际创建一个定时任务(一分钟执行一次),实现定时一分钟往表中插入数 ...
- 微信小程序客服、支付、定位、下拉加载功能
一.客服功能 1.只要你微信小程序,后台添加了客服,引用以下button,就可以进入聊天(在小程序官网如何添加客服用户,请自行百度,谢谢) 2.通过按钮方式 <button open-type= ...
- 音视频八股文(7)-- 音频aac adts三层结构
AAC介绍 AAC(Advanced Audio Coding)是一种现代的音频编码技术,用于数字音频的传输和存储领域.AAC是MPEG-2和MPEG-4标准中的一部分,可提供更高质量的音频数据,并且 ...
- 2020-09-15:java里的wait()和sleep()的区别有哪些?
福哥答案2020-09-15:#福大大架构师每日一题# 1.线程状态.wait()的线程状态是TimedWaiting和Waiting.sleep()的线程状态是Waiting.2.指定时间.wait ...
- vue基础入门综合项目练习-悦听播放器
1.简介 根据B站视频 黑马程序员vue前端基础教程-4个小时带你快速入门vue 学习制作. 再次感谢 免费无私的教学视频. 感谢 @李予安丶 提供的精美的css. 2.展示 3.技术点 vue2 a ...
- 7-2 Broken Pad (20 分)
1.题目描述: The party began, the greasy uncle was playing cards, the fat otaku was eating, and the littl ...
- SpringMVC 简单的开始
SpringMVC简单的开始 利用Spring模板配置写一个web项目. 1.核心配置文件(模板代码) <?xml version="1.0" encoding=" ...
- 查看svn本地账户和密码
最近由于抗击疫情需要远程办公,协同就必不可少了,都知道svn一般公司都是走内网,然而目前要连接公司svn就得重新指定地址,今日在重新指定时然我,输入用户名和密码一下子蒙了,平时一旦连接后就不需要再次输 ...
- vue对vue-giant-tree进行节点操作
vue 项目中使用到了vue-giant-tree这个使用ztree封装的树形插件,在对其节点进行操作时遇到了无法向传统的jquery那样获取到ztreeObj:而导致了无法控制节点dom:浪费了许多 ...
- ODOO页面使用css和js的流程
1 首先定义页面 <data> <record id="myquality_iqcbasesetup_form" model="ir.ui.view&q ...