基于WPF编写有趣的久坐提醒桌面小程序

 更新时间:2023年08月08日 09:18:29   作者:VipSoft  
这篇文章主要为大家详细介绍了如何基于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/releases/download/V1.0/Reminder.zip

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

到此这篇关于基于WPF编写有趣的久坐提醒桌面小程序的文章就介绍到这了,更多相关WPF桌面程序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#实现自动生成电子印章

    C#实现自动生成电子印章

    网络办公正逐渐成为常态,无纸化办公也是一个潮流。本文将利用C#语言实现自动生成电子印章功能,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-08-08
  • C#语言主要特性总结

    C#语言主要特性总结

    这篇文章主要介绍了C#语言主要特性总结,本文总结了C#语言的简单、现代、面向对象、类型安全、相互兼容性、可伸缩性和可升级性等几个主要特点,需要的朋友可以参考下
    2015-02-02
  • WPF利用CommunityToolkit.Mvvm实现级联选择器

    WPF利用CommunityToolkit.Mvvm实现级联选择器

    这篇文章主要介绍了WPF如何利用CommunityToolkit.Mvvm实现级联选择器,文中的示例代码讲解详细,对我们的学习或工作有一定帮助,需要的小伙伴可以参考一下
    2023-12-12
  • C#仿QQ实现简单的截图功能

    C#仿QQ实现简单的截图功能

    这篇文章主要为大家详细介绍了如何利用C#语言模拟QQ实现屏幕选择区域截图功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-08-08
  • C#面向对象的23种设计模式介绍

    C#面向对象的23种设计模式介绍

    这篇文章介绍了C#面向对象的23种设计模式,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02
  • C#中调用DLL时未能加载文件或程序集错误的处理方法(详解)

    C#中调用DLL时未能加载文件或程序集错误的处理方法(详解)

    下面小编就为大家带来一篇C#中调用DLL时未能加载文件或程序集错误的处理方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 利用WCF双工模式实现即时通讯

    利用WCF双工模式实现即时通讯

    这篇文章主要介绍了利用WCF双工模式实现即时通讯的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • C#并发编程之async和await关键字详解

    C#并发编程之async和await关键字详解

    对于 async 和 await 两个关键字,对于一线开发人员再熟悉不过了,到处都是它们的身影,下面小编就来和大家记录汇总下它们的使用吧
    2023-07-07
  • C#实现程序等待延迟执行的方法

    C#实现程序等待延迟执行的方法

    这篇文章主要介绍了C#实现程序等待延迟执行的方法,涉及C#动态链接库的使用及延迟的实现技巧,需要的朋友可以参考下
    2015-09-09
  • C#禁用双击窗体图标关闭窗体的方法

    C#禁用双击窗体图标关闭窗体的方法

    这篇文章主要介绍了C#禁用双击窗体图标关闭窗体的方法,通过对窗体参数的简单设置实现C#禁用双击窗体图标关闭窗体的功能,非常简单实用,需要的朋友可以参考下
    2015-08-08

最新评论