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

news2024/11/25 4:53:16

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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 number
            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;
            }

            // initialization
            display_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 num
            num1.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 num
            num1.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.coloradmin.cn/o/1292474.html

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

相关文章

stl库之map与例题

map是一种关联式容器&#xff0c;它允许将键&#xff08;key&#xff09;映射到值&#xff08;value&#xff09;&#xff0c;所以我们习惯称map为映射 每个元素都是一个键值对&#xff0c;其中键是唯一的 创建map map<key类型, value类型> 变量名; 创建一个键为int&…

11.7QT界面制作

#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {this->resize(881,550);this->setStyleSheet("backgroud-color:rgb(33,35,40)");this->setWindowFlag(Qt::FramelessWindowHint);//标签类QLabel *l1 new QLabel(this);/…

深入理解Flexbox:构建灵活的布局系统

由于篇幅限制&#xff0c;我将提供一个详细的文章大纲和部分内容。您可以根据这个大纲扩展文章内容&#xff0c;以满足3000字的要求。 深入理解Flexbox&#xff1a;构建灵活的布局系统 引言 在现代web设计中&#xff0c;创建灵活且响应式的布局是非常重要的。Flexbox&#xf…

通达OA inc/package/down.php接口存在未授权访问漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一. 产品简介 通达OA&#xff08;Office Anywhere网络智能办公系统&am…

List的元素覆盖问题

问题场景 在备课底层JDBC链接链接数据库时&#xff0c;将读取的数据封装到对象中并添加到list集合中出现了问题。 错误逻辑 代码编写的考量为减少对象占用内存。想通过一个对象完成数据的传递和保存。 核心问题 List集合存储的是每一个对象的引用地址&#xff0c;如果引用的…

perl脚本获取Windows系统常用路径信息

windows系统常用的路径,比如临时目录、资源文件夹、字体保存目录、应用程序数据存放目录等等。在日常操作的时候寻找略有不便。这里用perl写一个脚本&#xff0c;并把这些目录信息格式化为json&#xff0c;方便查找。如下是perl代码&#xff1a; #! /usr/bin/perl use v5.14; …

机器学习---环境准备

一、pySpark环境准备 1、window配置python环境变量 window安装python&#xff0c;配置python环境变量。安装python后,在环境变量path中加入安装的路径&#xff0c;cmd中输入python&#xff0c;检验python是否安装成功。 注意&#xff1a;如果使用的是anaconda安装的python环境…

Elaticsearch 学习笔记

文章目录 Elaticsearch 学习笔记一、什么是 Elaticsearch &#xff1f;二、Elaticsearch 安装1 es 安装2 问题解决3 数据格式 三、索引操作1 PUT 请求&#xff1a;在postman中&#xff0c;向 ES 服务器发 PUT 请求&#xff08;PUT请求相当于创建的意思&#xff09;2 GET 请求&a…

Unity3D实现鼠标悬浮UI或物体上显示文字信息

系列文章目录 Unity工具 文章目录 系列文章目录前言最终效果一、UI事件显示文字1-1 ui事件需要引用命名空间using UnityEngine.EventSystems;1-2 IPointerEnterHandler 接口1-3 IPointerExitHandler 接口1-4 IPointerMoveHandler 接口 二、场景搭建2-1 实现如下 三、代码实现3…

【数据库】树形数据组织架构下的封锁并发控制,B树索引并发访问控制,树协议原理及案例分析

数据库并发访问树协议 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会…

数码产品稿件怎么写?纯干货!

在科技日新月异的今天&#xff0c;数码产品已经成为人们生活的重要组成部分。无论是手机、电脑、平板还是智能家居&#xff0c;这些产品的出现都在不断改变着我们的生活方式。因此&#xff0c;对于数码产品的评测和分析就显得尤为重要。本文伯乐网络传媒将为你揭秘如何撰写高质…

ChatGPT可能即将发布新版本,带有debug功能:支持下载原始对话、可视化对话分支等

本文原文来自DataLearnerAI官方网站&#xff1a;ChatGPT内置隐藏debug功能&#xff1a;支持下载原始对话、可视化对话分支等 | 数据学习者官方网站(Datalearner) AIPRM的工作人员最近发现ChatGPT的客户端隐藏内置了一个新的debug特性&#xff0c;可以提高ChatGPT对话的问题调试…

【APP抓包】Charles+burp+夜神模拟器联动抓包(带导入系统级0证书)

【APP抓包】Charlesburp夜神模拟器联动抓包&#xff08;带导入系统级0证书&#xff09; 0x00、大傻春你要干什么&#xff1f;0x01、夜神模拟器安装0x02、安装Charles0、版本1、安装2、破解3、安装导入用户证书4、【非必要】安装系统证书 0x03、Charles配置代理1、Charles设置代…

python-比较Excel两列数据,并分别显示差异

利用 openpyxl 模块&#xff0c;操作Excel&#xff0c;比较Excel两列数据&#xff0c;并分别显示差异 表格数据样例如下图 A&#xff0c;B两列是需要进行比较的数据&#xff08;数据源为某网站公开数据&#xff09;&#xff1b;C&#xff0c;D两列是比较结果的输出列 A&#…

第二十一章网络通信总结博客

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmissio…

AttributeError: module ‘importlib_resources‘ has no attribute ‘path‘ 解决方案

问题描述 with importlib_resources.path("xx", fname) as p: AttributeError: module importlib_resources has no attribute path 博主使用的是python3.9&#xff0c;看importlib_resources在importlib-resources PyPI中的介绍&#xff0c;开始猜测问题出在pyth…

【重磅来袭!!!工程师必备初始化建工程软件】

重磅来袭&#xff01;&#xff01;&#xff01;工程师必备初始化软件 每个工程建立前&#xff0c;你是否为了要建立各种文件夹而烦恼&#xff1f;你是否为了因为工程每次文件夹不统一找不到文件而烦扰&#xff1f;来咯&#xff0c;Project Initial V1_0软件只需输入工程名称&am…

12-07 周四 Pytorch 使用Visdom 进行可视化

简介 在完成了龙良曲的Pytroch视频课程之后&#xff0c;楼主对于pytroch有了进一步的理解&#xff0c;比如&#xff0c;比之前更加深刻的了解了BP神经网络的反向传播算法&#xff0c;梯度、损失、优化器这些名词更加熟悉。这个博客简要介绍一下在使用Pytorch进行数据可视化的一…

VBA技术资料MF93:将多个Excel表插入PowerPoint不同位置

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

【JavaScript】JS——Map数据类型

【JavaScript】JS——Map数据类型 什么是Map?特性Map与Object的比较 map的创建map的属性map相关方法map的遍历 什么是Map? 存储键值对的对象。 能够记住键的原始插入顺序任何值&#xff08;对象或原始值&#xff09;都可以作为键或值。 特性 Map中的一个键只能出现一次&am…