首页 > 编程语言 >你们眼睛干涩,胀痛吗?C# WPF 久坐提醒桌面小程序

你们眼睛干涩,胀痛吗?C# WPF 久坐提醒桌面小程序

时间:2023-08-07 15:46:58浏览次数:38  
标签:countDown C# vm 倒计时 -- 窗体 WPF 久坐 休息

目录
久坐提醒桌面小程序

依赖库

  • .Net Framework 4.5
  • HandyControl 3.2

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

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

说明

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

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

久坐提醒倒计时

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

休息提醒倒计时

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

休息到计时

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

代码说明

设置界面、倒计时、休息界面,三个页面,通过 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

标签:countDown,C#,vm,倒计时,--,窗体,WPF,久坐,休息
From: https://www.cnblogs.com/vipsoft/p/17603959.html

相关文章

  • 【Rabbitmq】报错:ERROR CachingConnectionFactory Channel shutdown: channel error
    目录01报错原因02解决方案2.1全局配置2.2注解方式原文链接:【Rabbitmq】报错:ERRORCachingConnectionFactoryChannelshutdown:channelerror异常信息Channelshutdown:channelerror;protocolmethod:#method<channel.close>(reply-code=406,reply-text=PRECONDITI......
  • CAXA 3D实体设计2023(3D CAD设计软件)中文永久使用
    CAXA3D实体设计是一款专业的三维实体建模和设计软件,广泛应用于工业设计、机械设计和制造等领域。它具有强大的功能和灵活的工作流程,能够帮助设计师高效地创建和编辑复杂的三维模型。点击获取CAXA3D 首先,CAXA3D实体设计提供了丰富的建模工具和功能。用户可以使用各种绘图工......
  • 视频融合平台视频汇聚平台LiteCVR新功能播放限制概念分享教程
    LiteCVR平台可以在复杂的网络环境中集中管理和整合各种分散的视频资源,实现视频资源的身份验证、按需访问、全网传播和智能分析等功能。该平台支持多种协议和设备类型的接入,包括GB28181、RTMP、RTSP/Onvif、海康SDK、大华SDK、海康Ehome等,并最近扩展了更多的SDK接入,如华为SDK、宇视S......
  • Linux 网络抓包工具 Tcpdump
    Linuxtcpdump命令示例tcpdump是一个功能最强大且广泛使用的命令行数据包嗅探或数据包分析工具,用于捕获或过滤在特定接口上接收或传输的TCP/IP数据包。Tcpdump在许多Linux/Unix操作系统中都是现成的。此外,它提供了一个宝贵的选项,可以将捕获的数据包保存到文件中以供将来分析......
  • Spring—ObjectProvider更加宽泛的依赖注入
    1.Spring依赖注入在Spring4.3之后,引入了一个新特性:当构造方法只有一个参数时,可以不使用@Autowired注解。@ServicepublicclassFooService{privateFooRepositoryfooRepository;publicFooService(FooRepositoryfooRepository){this.fooRepository=foo......
  • Word控件Spire.Doc 转换教程(一):在 C#、VB.NET 中将 Word Doc 转换为 XML
    谈到OfficeOpenXML,我们可能会想到HTML。实际上,OfficeOpenXML与HTML类似,都是基于标签的语言。OfficeOpenXML和HTML之间的区别在于OfficeOpenXML使用的标记不是预定义的。如果我们在OfficeOpenXML中创建自己的标签,我们需要遵循一些规则。首先,OfficeOpenXML文档中......
  • BOSHIDA DC电源模块对于定制的要求主要有这几点
    BOSHIDADC电源模块对于定制的要求主要有这几点DC电源模块是一种将交流电转换成为稳定的直流电的装置。在现代工业生产中,DC电源模块被广泛应用于各种电子设备中,例如计算机、手机、电视等。为了满足不同用户需求,DC电源模块的定制需求也是多种多样的。以下是DC电源模块对于定制的要......
  • 如何用好Chatgpt学习——以IPV6举例
    一、如何用Chatgpt已经火了挺久,在学习中如何能把Chatgpt使用到极致。一个字就是问,两个字就是沟通,比如想要了解什么是ipv6,向Chatgpt提问,Chatgpt会给我们详细的介绍。如果还不了解,可以进一步追问,比如让chatgpt举例,或者探讨。二、ChatGPT的扩展应用在ChatGPT创建一些想法(你想象中的万......
  • 网工这行最大的内卷,就是养了一批“HCIE”
    下午好,我是老杨。这段时间,我个人工作上的事儿挺多,一直在处理。手底下的一个重要项目组,想招个新人,面了几批都不满意,难搞。前两天刚定下人选,现下和你聊上几句。上回说过,我的部门招人,HR过了一遍的简历,100%都是有IE证书的。但我面的这么多人里,虽然都有IE,但人才质量可谓是天差地别。十多......
  • 视频融合平台视频汇聚平台LiteCVR与文旅大数据平台相关案例概念分享
    LiteCVR视频融合平台是一个基于云边端协同架构的平台,旨在支持旅游行业的信息化建设和智能化管理需求。该平台具备多种视频能力,包括监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、语音对讲和智能分析等功能。它可以广泛应用于旅游、工地、工厂、园区、楼宇、校......