C# WPF上位机开发(带配置文件的倒计时软件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        前面我们写了倒计时软件,但是不知道大家有没有发现,这个软件起始有一个缺点,那就是倒计时的起始时间都是硬编码生成的。所以每当我们需要重新设置起始时间,就只能通过修改代码的方式,重新生成软件才可以完成。这样使用起来就很不方便。那么,有没有办法来解决这个问题呢?

        一个比较好的办法就是通过配置文件的方式来进行解决。每次程序加载的时候,通过配置文件获取数据,这样就用户就可以通过设置参数,来自由设定自己需要的起始时间。目前用的比较多的,就是ini文件方式,比如像这样,


[ basic_config ]
;comment
time_expiration =7200

        我们可以先通过basic_config找到这个section,接着通过time_expiration这个key,就可以找到对应的数值7200。当然c# wpf也包含了对应的第三方库,安装起来很方便。

1、安装IniParser库

        和之前的vs开发不同,vs自身带有NuGet工具,通过这个NuGet工具,就可以检索和下载自己需要的第三方软件。因此,我们可以通过右击项目里面的引用,弹出窗口,

        继续单击“管理NuGet程序包”,这个时候在搜索引擎里面下载我们需要的IniParser库即可,

        等IniParser下载完毕之后,我们就可以在引用一栏里面看到对应的第三方库了,

2、修改代码

        之前我们编写倒计时软件的时候,起始值是通过代码的方法直接赋值的。当前既然我们已经添加了IniParser库,那么有必要创建一个config.ini文件之后,通过IniParser来解析对应的数据值。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;using IniParser;
using IniParser.Model;namespace WpfApp
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{private int num = 0;private System.Windows.Threading.DispatcherTimer dispatcherTimer = null;public MainWindow(){InitializeComponent();// load numbervar parser = new FileIniDataParser();try{IniData data = parser.ReadFile("config.ini");num = (int)Convert.ToUInt32(data["basic_config"]["time_expiration"]);}catch(Exception e){num = 3600;}// initializationdisplay_number();dispatcherTimer = new System.Windows.Threading.DispatcherTimer();dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);dispatcherTimer.Interval = new TimeSpan(0, 0, 1);dispatcherTimer.Start();}private void dispatcherTimer_Tick(object sender, EventArgs e)//计时执行的程序{num -= 1;if (num == 0){dispatcherTimer.Stop();return;}display_number();}private void display_number(){// display numnum1.Content = Convert.ToString((num / 3600) / 10);num2.Content = Convert.ToString((num / 3600) % 10);num4.Content = Convert.ToString((num % 3600 / 60) / 10);num5.Content = Convert.ToString((num % 3600 / 60) % 10);num7.Content = Convert.ToString((num % 60) / 10);num8.Content = Convert.ToString((num % 60) % 10);}}
}

        代码大体和之前的倒计时软件很相似。不同的地方大约有这么三处。第一处,就是代码中增加了IniParser库的引用,这也是为了后续的函数调用做准备,

using IniParser;
using IniParser.Model;

        第二处,就是num的获取方式发生了改变,这也是本次文章编写的主要目的。之前是固定写成某一个数值,现在是通过配置文件读取的形式进行处理。当然,为了防止异常的发生,这里还添加了try-catch的组合形式,防止有异常情况发生。

            var parser = new FileIniDataParser();try{IniData data = parser.ReadFile("config.ini");num = (int)Convert.ToUInt32(data["basic_config"]["time_expiration"]);}catch(Exception e){num = 3600;}

        第三处属于功能增加,之前倒计时只有分、秒,这一次把小时也添加上了,这样使用的场景也更多了很多。

            // display numnum1.Content = Convert.ToString((num / 3600) / 10);num2.Content = Convert.ToString((num / 3600) % 10);num4.Content = Convert.ToString((num % 3600 / 60) / 10);num5.Content = Convert.ToString((num % 3600 / 60) % 10);num7.Content = Convert.ToString((num % 60) / 10);num8.Content = Convert.ToString((num % 60) % 10);

3、更新界面

        界面部分主要是需要增加三个label,毕竟这次显示的内容要比之前多了一些。

<Window x:Class="WpfApp.MainWindow"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:local="clr-namespace:WpfApp"mc:Ignorable="d"Title="Timer" Height="450" Width="800"><Grid><Label x:Name="num1" FontSize="80" Content="0" HorizontalAlignment="Left" Margin="183,130,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.38,0.541"/><Label x:Name="num2" FontSize="80" Content="0" HorizontalAlignment="Left" Margin="228,130,0,0" VerticalAlignment="Top" RenderTransformOrigin="-0.395,0.609"/><Label x:Name="num3" FontSize="80" Content=":" HorizontalAlignment="Left" Margin="290,130,0,0" VerticalAlignment="Top" RenderTransformOrigin="-0.395,0.609"/><Label x:Name="num4" FontSize="80" Content="0" HorizontalAlignment="Left" Margin="323,130,0,0" VerticalAlignment="Top"/><Label x:Name="num5" FontSize="80" Content="0" HorizontalAlignment="Left" Margin="368,130,0,0" VerticalAlignment="Top"/><Label x:Name="num6" FontSize="80" Content=":" HorizontalAlignment="Left" Margin="434,130,0,0" VerticalAlignment="Top" RenderTransformOrigin="-0.395,0.609"/><Label x:Name="num7" FontSize="80" Content="0" HorizontalAlignment="Left" Margin="463,130,0,0" VerticalAlignment="Top"/><Label x:Name="num8" FontSize="80" Content="0" HorizontalAlignment="Left" Margin="515,130,0,0" VerticalAlignment="Top"/></Grid>
</Window>

4、运行测试

        运行测试相比较而言就比较简单了,我们可以在config.ini文件里面的time_expiration设置一个起始时间,在这之后,编译运行代码,查看起始运行的时候是否和我们设置的内容一致。如果在这过程当中没有问题,那说明软件编写就是ok的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/195511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Security 自定义异常失效?源码分析与解决方案

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

分享73个节日PPT,总有一款适合您

分享73个节日PPT&#xff0c;总有一款适合您 73个节日PPT下载 链接&#xff1a;https://pan.baidu.com/s/1FG9Y-9yR31Y-fs3zxKI4Pg?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…

vue3 mixins

Vue3 中的 mixins 是一种复用组件逻辑的方式。在 Vue2 中&#xff0c;我们通常使用 mixins 来将一些全局的方法或者数据混入到多个组件中。但是在 Vue3 中&#xff0c;由于组合式 API 的引入&#xff0c;我们可以使用更灵活的方式来复用逻辑。 在 Vue3 中&#xff0c;我们可以…

LeetCode | 572. 另一棵树的子树

LeetCode | 572. 另一棵树的子树 OJ链接 我们需要判断两棵二叉树是否相同&#xff0c;如果再判断的的时候不同我们就直接返回false&#xff0c;否则就返回true然后再检查左子树和右子树里面是否存在subRoot子树~~ bool isSameTree(struct TreeNode* q, struct TreeNode* p) {…

C语言从入门到实战——常用内存函数的了解和模拟实现

常用内存函数的了解和实现 前言1. memcpy使用和模拟实现2. memmove使用和模拟实现3. memset函数的使用4. memcmp函数的使用 前言 内存函数&#xff08;memory functions&#xff09;指的是控制计算机内存操作的函数 1. memcpy使用和模拟实现 void * memcpy ( void * destinat…

uniapp:如何使用uCharts

目录 第一章 前言 第二章 安装插件uCharts 第三章 使用uCharts 第四章 注意 第一章 前言 需求&#xff1a;这是很久之前的一个项目的需求了&#xff0c;当时我刚接触app&#xff0c;有这么一个需求&#xff0c;在uniapp写的app项目中做一些图表统计&#xff0c;最开始以为…

EasyRecovery2024激活码秘钥

EasyRecovery从&#xff08;易恢复2024&#xff09;支持恢复不同存储介质数据&#xff0c;在Windows中恢复受损和删除文件,以及能检索数据格式化或损坏卷&#xff0c;甚至还可以从初始化磁盘。同时&#xff0c;你只需要最简单的操作就可以恢复数据文件&#xff0c;如&#xff1…

在java中如何解决in unnamed module @0x602ff1d9得问题

在日常得java开发中&#xff0c;点击maven得编译得时候会出现&#xff1a;class lombok.javac.apt.LombokProcessor (in unnamed module 0x58313b33) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module…

代码随想录算法训练营第五十四天 | 392.判断子序列,115.不同的子序列

目录 392.判断子序列 115.不同的子序列 392.判断子序列 题目链接&#xff1a;392. 判断子序列 设 s 的指针&#xff0c;遍历 t 的各个元素&#xff0c;当 t 与 s 对应元素相同时&#xff0c;指针前进&#xff1a; class Solution { public:bool isSubsequence(string s, string…

【刷题】Modular Multiplicative Inverse 模逆元

模逆元 定义 整数 a a a的模逆元是满足 a ⋅ x a\cdot x a⋅x模一个模数 m m m等于1。也就是找到一个数 x x x: a ⋅ x ≡ 1 mod m. a \cdot x \equiv 1 \text{ ~~~~mod m.} a⋅x≡1 mod m. 也可以把 x x x表示为 a − 1 a^{-1} a−1 需要注意模逆并不是总是存在。例如…

Vue3实现滚动到容器底部时发送请求,加载新数据

问题来源 在项目中出现了需要在容器滚动到底部时&#xff0c;加载新的数据的需求&#xff0c;以下是解决的方案笔记 解决 画了个流程图&#xff1a; 如图&#xff0c;先添加一个动态加载的图标&#xff0c;还有全部数据载完的《到底啦...》 大概这么个样子&#xff0c;之后呢…

PMP备考必看|浅谈PMP证书的价值,PMP考试详细全流程

作为已经在项目管理领域摸爬滚打五年的资深项目经理&#xff0c;我可以诚实的告诉大家&#xff0c;在项目管理领域拥有丰富项目管理经验的人都知道&#xff0c;很多公司在发布招聘信息时都会要求申请者持有PMP证书&#xff0c;这些证书在项目经理岗位的要求中经常出现。 在实际…

【PyTorch】softmax回归

文章目录 1. 模型与代码实现1.1. 模型1.2. 代码实现 2. Q&A 1. 模型与代码实现 1.1. 模型 背景 在分类问题中&#xff0c;模型的输出层是全连接层&#xff0c;每个类别对应一个输出。我们希望模型的输出 y ^ j \hat{y}_j y^​j​可以视为属于类 j j j的概率&#xff0c;然…

阿里云ACE认证含金量有多高?2023年海南E类人才认证政策告诉你答案!

2023年海南省高层次人才享受什么待遇&#xff1f;海南高层次人才住房补贴多少钱&#xff1f;海南高层次E类人才待遇有哪些&#xff1f;什么是海南高层次E类人才&#xff1f;E类人才怎么申请&#xff1f;这篇文章给大家详细介绍一下。 1.E类人才在海南有什么好处&#xff1f; …

ArcGIS提示当前许可不支持影像服务器

1、问题&#xff1a; 在用ArcGIS上处理影像栅格数据时&#xff08;比如栅格数据集裁剪、镶嵌数据集构建镶嵌线等&#xff09;经常会出现。 无法启动配置 RasterComander.ImageServer <详信息 在计算机XXXXX上创建服务器对象实例失败 当前许可不支持影像服务器。 ArcGIS提示当…

Python的模块与库,及if __name__ == ‘__main__语句【侯小啾Python基础领航计划 系列(二十四)】

Python的模块与库,及if name == ‘__main__语句【侯小啾Python基础领航计划 系列(二十四)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

轻量级网络结构的目标检测算法——Yolov8介绍

1. Yolov8算法概述 Yolov8是一种目标检测算法&#xff0c;它通过独特的双路径预测和紧密的连接的卷积网络进行目标检测。该算法采用了轻量级网络结构&#xff0c;同时保持了较高的性能&#xff0c;因此具有高效的特点。此外&#xff0c;Yolov8还采用了级联和金字塔…

MYSQL练题笔记-聚合函数-各赛事的用户注册率

一、题目相关内容 1&#xff09;相关的表 2&#xff09;题目 3&#xff09;帮助理解题目的示例&#xff0c;提供返回结果的格式 二、自己初步的理解 有两张不同左右的表&#xff0c;用户表和赛事注册表。然后解题。 1.各种赛事的用户注册百分率 各种赛事的意味着通过contes…

synchronized底层原理(一)

文章目录 1. 问题引入2. 相关概念3. Synchronized使用4. Synchronized底层原理1. 简介2. Monitor&#xff08;管程/监视器&#xff09;3. Java语言的内置管程synchronized4. Java对象的内存布局5. 如何使用MarkWord记录锁状态6. 偏向锁7. 轻量级锁 1. 问题引入 假设我们有1000…

手把手教你写一个Shell脚本部署你的服务

我们都知道&#xff0c;在开发的过程中&#xff0c;有很多部署自己微服务的方式&#xff0c;其中有各种各样的不同操作&#xff0c;比如使用 docker 打包为镜像的方式&#xff0c;还有基础使用 jar 包的方式进行部署&#xff0c;但是呢&#xff1f;使用 jar 包部署&#xff0c;…