基于WPF編寫有趣的久坐提醒桌面小程序
久坐提醒桌面小程序: 干這行職業(yè)病比較多,之前用愛(ài)麗(即:玻璃酸鈉滴眼液),用的時(shí)候挺舒服,緩解吧,不過(guò)治標(biāo)不治本。注意休息,加強(qiáng)鍛煉非常有必要,這周開(kāi)始每工作1小時(shí),休息10分鐘(程序中有鎖鍵盤鼠標(biāo)的功能,那個(gè)太狠了,萬(wàn)一領(lǐng)導(dǎo)要東西電腦鎖住了尷尬了,被我注釋了),看看遠(yuǎn)方,綠值,站個(gè)樁,或者高架馬步,馬步扎得好,到老疾病少,不過(guò)注意別把膝蓋搞壞了,我玩得狠現(xiàn)在有積液了
依賴庫(kù)
- .Net Framework 4.5
- HandyControl 3.2
網(wǎng)上下的一些小程序,達(dá)不到自己想要的效果,要么就是功能復(fù)雜,于是選擇了自己開(kāi)發(fā)。
采用WPF 基于HandyControl 開(kāi)發(fā)的小程序。
- 有2年不寫WPF開(kāi)發(fā)了,練練手
- 平時(shí)工作一坐就是半天,眼睛不怎么好了,干眼嚴(yán)重
說(shuō)明
設(shè)置提醒時(shí)間,及休息時(shí)間
默認(rèn)50分鐘休息10分鐘,按整點(diǎn)算(強(qiáng)迫癥),如果工作不足10分鐘,則將時(shí)間加到下一輪中。
取消整點(diǎn)勾選,從開(kāi)始時(shí)計(jì)劃

久坐提醒倒計(jì)時(shí)
開(kāi)始后右下角有小球球,顯示倒計(jì)時(shí),像360那樣的窗口懸停不知道怎么做,沒(méi)繼續(xù)研究

休息提醒倒計(jì)時(shí)
距休息10秒時(shí),窗體會(huì)顯示到最上層,同時(shí)字體顏色變?yōu)辄S色

休息到計(jì)時(shí)
從網(wǎng)上找的護(hù)眼圖片,可以照著練練,再起來(lái)走一走。

代碼說(shuō)明
設(shè)置界面、倒計(jì)時(shí)、休息界面,三個(gè)頁(yè)面,通過(guò) VmReminder 進(jìn)行數(shù)據(jù)共享
主窗體設(shè)置
這是基本框架,參考Office設(shè)計(jì),右上解可擴(kuò)展【設(shè)置】、【幫助】功能,可用于其它項(xiàng)目
設(shè)置工作時(shí)長(zhǎng)、休息時(shí)長(zhǎng),默認(rèn)從整點(diǎn)開(kāi)始計(jì)時(shí)(有強(qiáng)迫癥)
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;
//開(kāi)始后,調(diào)用倒計(jì)時(shí)窗體,并將倒計(jì)時(shí)窗體設(shè)為主窗體,否則點(diǎn)拖盤圖標(biāo),會(huì)彈出設(shè)置窗體
CountDown countDown = new CountDown();
countDown.DataContext = this._vm;
countDown.InitData();
Application.Current.MainWindow = countDown;
countDown.Show();
this.Close();
}工作到計(jì)時(shí)
窗口倒計(jì)時(shí)時(shí),顯示在窗口右下角,
CountDown.xml
托盤圖標(biāo)--放在這個(gè)窗體下的原因,是因?yàn)?休息轉(zhuǎn)工作時(shí),避免托盤下會(huì)出現(xiàn)多個(gè)圖標(biāo)
<hc:NotifyIcon x:Name="NotifyIcon" Click="NotifyIconContextContent_OnClick"
Text="久坐提醒"
Visibility="Visible"
Icon="/Application.ico">
<hc:NotifyIcon.ContextMenu>
<ContextMenu>
<MenuItem Click="Settings_OnClick" Header="設(shè)置"/>
<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#}" 顯示倒計(jì)時(shí),格式化,如果個(gè)位數(shù)時(shí),前面補(bǔ)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;
}通過(guò)定時(shí)器,工作實(shí)現(xiàn)倒計(jì)時(shí)功能
private void Timer_OnTick(object sender, EventArgs e)
{
Remind();
//倒計(jì)時(shí)時(shí)結(jié)束,彈出休息窗口
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--;
}
}休息倒計(jì)時(shí)
休息窗體顯示兩護(hù)眼張圖片和一個(gè)休息到計(jì)時(shí),按ESC時(shí)可取消本次休息,
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
{
// 定時(shí)器
private DispatcherTimer _timer;
public VmReminder _vm;
public WorkBreak()
{
InitializeComponent();
WindowState = WindowState.Maximized; //全屏顯示
ShowInTaskbar = false; //任務(wù)欄不顯示圖標(biāo)
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; //任務(wù)欄不顯示圖標(biāo)
_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)
{
//倒計(jì)時(shí)時(shí)結(jié)束,彈出休息窗口
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--;
}
}
}
}源碼
運(yùn)行包:https://gitee.com/VipSoft/Reminder/releases/download/V1.0/Reminder.zip
源碼地址:https://gitee.com/VipSoft/Reminder
到此這篇關(guān)于基于WPF編寫有趣的久坐提醒桌面小程序的文章就介紹到這了,更多相關(guān)WPF桌面程序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#保存listbox中數(shù)據(jù)到文本文件的方法
這篇文章主要介紹了C#保存listbox中數(shù)據(jù)到文本文件的方法,涉及C#操作listbox數(shù)據(jù)的相關(guān)技巧,需要的朋友可以參考下2015-04-04
C#自定義RSA加密解密及RSA簽名和驗(yàn)證類實(shí)例
這篇文章主要介紹了C#自定義RSA加密解密及RSA簽名和驗(yàn)證類,實(shí)例分析了C#實(shí)現(xiàn)RSA加密解密及RSA簽名和驗(yàn)證的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
C#中對(duì)字符串進(jìn)行壓縮和解壓的實(shí)現(xiàn)
本文主要介紹了C#中對(duì)字符串進(jìn)行壓縮和解壓的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
C#模擬鏈表數(shù)據(jù)結(jié)構(gòu)的實(shí)例解析
這篇文章主要介紹了C#模擬鏈表數(shù)據(jù)結(jié)構(gòu)的實(shí)例解析,包括隊(duì)雙向鏈表的模擬方法,例子中隊(duì)鏈表的操作也有很好的說(shuō)明,需要的朋友可以參考下2016-04-04
C#中Decimal類型截取保留N位小數(shù)并且不進(jìn)行四舍五入操作
這篇文章主要介紹了C#中Decimal類型截取保留N位小數(shù)并且不進(jìn)行四舍五入操作,本文給出需求說(shuō)明和實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-06-06

