桌面软件
文章平均质量分 57
主要记录WPF,QT等桌面软件开发的技术笔记
外来物种
全栈工程师
展开
-
SVN 提交忽略文件和目录汇总
▪SVN 忽略介绍默认情况下,SVN 会提交本地全部的文件。如果你想让 SVN 忽略指定的名字文件或目录,那么就需要设置 svn:ignore 或 svn:global-ignores 属性。svn:ignore 只对当前目录起作用svn:global-ignore 对当前电脑里所有的目录起作用svn:ignore 或 svn:global-ignores 属性用于设置本地工作目录下的哪些目录或文件不用进行版本管理,这样在本地对这些内容进行添加、修改等操作时,SVN 都会对其忽略。.原创 2021-03-15 15:10:11 · 1766 阅读 · 0 评论 -
WPF 自定义表单控件项:Label + TextBox
▪ 前言WPF 内置了丰富的 UI 控件,但是他们都是独立。在实际的开发中,我们经常需要将几个 UI 控件组合起来用。比如下面 效果图 中的 “账号输入项”:背景白色,左侧 Label控件,右侧 TextBox控件。当然它还有一些变种:背景是透明的,下面有条白线。为了和 “UI 控件” 名字区分,我们约定将几个 “UI 控件” 组合的统称为 “表单控件项”▪ 效果图▪ 原始实现白色背景的 表单控件项(账号输入项)实现代码:<DockPanel Width="360" Height="3原创 2021-01-08 11:58:56 · 2619 阅读 · 0 评论 -
WPF 之 DataGrid 入门实践三:样式美化
▪ 前言.Net 对 UI 控件提供了丰富的样式设置属性,但是当你不是很熟练或者长时间没有使用后很容易忘记其样式的属性,这里对常用的 DataGrid 样式设置做个笔记,以便日后查阅。▪ 基本样式DataGrid 的视图代码:# xaml<DataGrid Style="{StaticResource styleDataGridView}" Height="600"> <DataGrid.Columns> <DataGridTextColumn原创 2021-01-08 11:57:09 · 2842 阅读 · 0 评论 -
WPF 之 DataGrid 入门实践二:数据保存
▪ 前言在 《WPF 之 DataGrid 入门实践一》 中,我们已经初识 DataGrid 控件,也看到了 DataGrid 的样子。接下我们就要学习 DataGrid 最为重要的功能,就是保存修改后的 DataGrid 数据。▪ 基础代码在 《WPF 之 DataGrid 入门实践一》 中,我们已经构建显示在 DataGrid 表中的数据,为了适应本章的内容,我们稍微重构了 实践一 中的基础代码。重构前台 XAML 代码:# xaml<DataGrid x:Name="uiStuden原创 2021-01-08 11:55:52 · 1900 阅读 · 0 评论 -
WPF 之 exe 单文件打包工具:LibZ
▪ 前言在 VS 开发过程中我们需要不断的编译软件并进行测试,同时 VS 会自动在项目跟目录的 \bin\Debug 文件夹里生成一系列文件(包括程序执行的主 exe 文件)。对于简单 WPF 程序,我们通常可以直接拷贝 [Project Sub]\bin\Debug 下程序主 exe 文件就可以到其他机子使用了,当然前提是机子要已经装了对应的 .Net Formework 版本库但是有时候我们会在项目引入其他第三方库(非 .Net 框架内置的库)并在代码中使用,例如:处理 JSON 数据的 Newt原创 2021-01-08 11:45:56 · 1637 阅读 · 0 评论 -
WPF 之布局参考:登录窗口 01
▪ 布局效果▪ 布局代码<Window [...] Width="400" Height="240" WindowStyle="None" AllowsTransparency="True" ShowInTaskbar="False" Background="#00FFFFFF" WindowStartupLocation="CenterScreen" Topmost="True"> <Border CornerRadius="10,10,10,10" Background=原创 2021-01-08 11:44:12 · 138 阅读 · 0 评论 -
WPF 异步更新 UI 的几种方法
▪ 说明首先强调一点:异步更新 UI 实际上就是新开一个线程,然后线程执行一些耗时的任务,而 UI 线程继续响应用户的操作。但是 WPF 的机制确限制新开的线程不能直接访问 UI 控件,所以 非UI线程 访问 UI 控件就需要用一种特殊的方法来执行。▪ 使用 Task 类异步更新环境:Task 类需要 .Net 4.0 以上案例:UI 上有三个 TextBlock,一个 Button逻辑:当点击 Button 的时候新三个 Task 产生随机数(模拟耗时操作),然后将产生的随机数给UI显示pr原创 2020-12-17 08:19:34 · 3133 阅读 · 0 评论 -
WPF 内置 BUG 之:ResizeMode 和 窗体尺寸
▪ 前言在用 .Net 4.0 开发 WPF 软件时,我们可能需要禁用或者隐藏窗口右上角的 最小化、最大化或关闭 按钮(当然同时可能也伴随着需要固定窗口尺寸的要求)。好在 WPF 已经为我们提供了非常方便的方法,利用 Window 标签的 ResizeMode 属性,我们可以按需设置自己想要的效果:<Window x:Class="CarSensorMelexis.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006原创 2020-12-17 08:18:57 · 2547 阅读 · 1 评论 -
WPF 控件自定义模板之:圆形进度条
▪ 前言项目开发需要,需要做一个圆形的进度条,但是发现 WPF 自带的进度条控件 ProgressBar 无法直接变成圆形,经过不停的Baidu、Google,终于找到了基于 ProgressBar 构建圆形进度条的方法▪ 效果图▪ 辅助控件引用在改造 ProgressBar 控件中,我们将用到 ControlTemplate 模板功能以及 <ed:Arc> 控件。<ed:Arc> 是一个画圆弧的控件(非 WPF 内置的控件),所以我们必须引用进来,否则使用将编译出错。原创 2020-12-17 08:18:26 · 1963 阅读 · 1 评论 -
WPF 控件自定义模板之:ProgressBar
▪ 扁平化<Window.Resources> <Style x:Key="styleProgressBar" TargetType="ProgressBar"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ProgressBar">原创 2020-12-17 08:17:55 · 580 阅读 · 0 评论 -
WPF 窗口接收 Windows 消息
▪ Windows 消息在做一些 COM 串口、USB 相关的软件时,我们需要程序实时监测这些端口的状态:比如是否新插入、是否拔出等等,从而让软件做出相应的动作。实际编写过程中,▪ WPF 处理 Windows 消息的几种方式1. Windows API 钩子WPF 的窗体并没有 Winform 中的 Handle,所以在使用 API 时并不能直接使用设置或者移除钩子。要想使用 API 的 SetWindowsHookEx, UnhookWindowsHookEx, CallNextHookEx原创 2020-12-17 08:17:24 · 1880 阅读 · 0 评论 -
DevExpress 控件快速上手之 ChartControl:XYDiagram2D(折线图)
▪ 前言DevExpress 中有一个专门用来绘制图表的插件 ChartControl,可以绘制折线图、饼状图、柱状图等图表。这篇文章将介绍如何快速上手 XYDiagram2D(折线图) 的使用方法。动态创建,顾名思义就是利用 C# 创建一个折线图。相对于动态,还有一个是静态创建,简单讲静态创建就是直接在 xaml 里编写折线图的代码,其好处就是可以直接利用 VS2015 的工具箱和属性进行可视化拖拽修改,方便快捷。但是出于灵活性和重用性的考虑,推荐使用动态创建;本文也将全部采用动态创建的方式来构建原创 2020-12-17 08:16:19 · 3838 阅读 · 2 评论 -
C# 中往按钮事件中传递自定义参数
▪ 前言通过 C# 代码动态生成的按钮,需要自定义点击事件。但是生成的点击事件的参数是固定的,如何才能传入自定义的参数?默认的固定参数Button button = new Button(){ Margin = new Thickness(5), Content = "我是按钮",};button.Click += uiButton_Click;// 生成的点击事件的方法参数是固定的private void uiButton_Click(object sender, Ro原创 2020-12-17 08:15:41 · 1851 阅读 · 0 评论 -
C# 中定时器的种类和常用方法
▪ 前言在 .Net 常用的定时器类有下面三种,使用定时器时需要设定参数,如间断时间、定时器计溢出后的回调函数、延时、开始等,定时器的主要方法有开始、终止等,不同的定时器实现上述的方法会有一些差异,本文会针对具体的定时器一一举例说明。System.Windows.Forms.Timer 定时器类System.Threading.Timer 定时器类System.Timers.Timer 定时器类▪ System.Windows.Forms.Timer从这个定时器的命名空间可以看出,.Net原创 2020-12-17 08:15:10 · 2309 阅读 · 1 评论 -
C# 之 System.Diagnostics.Process.Start 的妙用
▪ 前言我们经常会遇到在 Winform 或是 WPF 中点击链接或按钮打开某个指定的网址、 或者是需要打开电脑中某个指定的硬盘分区及文件夹、甚至是 “控制面板” 等相关的东西, 那么如何做呢?▪ System.Diagnostics.Process.Start利用 Windows 的底层函数 System.Diagnostics.Process.Start() 我们就能实现上述的需求。该函数的作用是调用外部的命令或者某个应用程序。先来看看它的调用方法:Process.Start() Proce原创 2020-12-17 08:14:38 · 3069 阅读 · 0 评论 -
C# 之 ToString() 格式化全说明
▪ 前言有时,我们可能需要将数值以一定的格式来呈现,就需要对数值进行格式化。XXX.ToString 格式化数值结果表格式说明符说明示例输出C货币15.ToString(“C”)¥15.0015.ToString(“C1”)¥15.015.ToString(“C3”)¥15.000D十进制数15.ToString(“D1”)1515.ToString(“D2”)1515.ToString(“D5”)00015原创 2020-12-15 13:48:50 · 18212 阅读 · 0 评论 -
C# 之 Linq to Xml
▪ 前言我相信很多从事 .NET 开发的,在 .NET 3.5 之前操作XML会比较麻烦,但是在此之后出现了 Linq to Xml,而今天的主人公就是 Linq to Xml,废话不多说,直接进入主题。一、生成Xml为了能够在结构有一定的组织,笔者建议大家新建一个控制台项目,并且新建一个 CreateXml 类(以下代码都属于该类中)。并在其中写入以下属性:public static String Path{ get { return String.Format原创 2020-12-15 13:46:54 · 573 阅读 · 0 评论 -
C# 之 Json.NET 库:JObject 中属性值 null
▪ 问题先看下我们常规声明一个变量的代码:JObject json = null;MessageBox.Show(json==null?"null":"no null"); // 输出:null对一个变量赋 null 值,我们可以直接通过 ... == null 进行判断,但是当我们按照这样的原则去设置和检查 JObject 中项的属性时确遇到了问题:JObject json = new JObject(){{"age",null}};MessageBox.Show(json["age"]=原创 2020-12-15 13:46:23 · 5978 阅读 · 2 评论 -
C# 发起 GET 和 POST 请求的几种方法
▪ 方法一GET// 创建 WEB 请求对象HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.domain.com/");// 执行 WEB 请求HttpWebResponse response = (HttpWebResponse)request.GetResponse();// 将返回的数据流读到字符串String result = new StreamReader(response.GetRe原创 2020-12-15 13:45:52 · 1080 阅读 · 0 评论 -
C# 处理 JSON 之 Json.NET 库
▪ Json.NET 介绍在做开发的时候,很多数据交换都是以 JSON 格式传输的。而使用 JSON的时候,我们很多时候会涉及到几个序列化对象的使用:DataContractJsonSerializer,JavaScriptSerializer 和 Json.NET(或者叫 Newtonsoft.Json)。这里推荐性能以及通用性较好 Json.NET,虽然这个不是微软的类库,但是它是一个开源的世界级的 JSON 操作类库,无论是使用便利上还是性能上都非常棒。▪ Json.NET 安装因为 Json.原创 2020-12-15 13:45:19 · 3508 阅读 · 0 评论 -
C# 之 Dictionary 详解
▪ 说明必须包含名空间 System.Collection.GenericDictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值)键必须是唯一的,而值不需要唯一的键和值都可以是任何类型(比如:string, int, 自定义类型等等)可以简单将 Dictionary 理解为 键值对 数据的集合▪ 常规使用方法// 定义Dictionary<string, string> dictExecutes = new Dictionary<string,原创 2020-12-15 13:44:52 · 22816 阅读 · 1 评论 -
C# 之数据类型间转换
▪ String 转 Color(Color)ColorConverter.ConvertFromString("#FF009900");▪ String 转 BrushBrush br = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF009999"));▪ Color 转 BrushBrush br = new SolidColorBrush(Color.FromRgb(0,0,0));...原创 2020-12-15 13:43:48 · 135 阅读 · 0 评论 -
一站式WPF:线程模型 和 Dispatcher
▪ 前言开始着手写这个WPF系列,这里的一站式就是力争在每一个点上能把它讲透。当然,做不到那么尽善尽美,如果有不对的地方也欢迎朋友们指正,我会逐步补充,争取把这个系列写好。通常,WPF 应用程序从两个线程开始:一个用于处理呈现(render),一个用于管理 UI。呈现线程有效地隐藏在后台运行,而 UI 线程则接收输入、处理事件、绘制屏幕以及运行应用程序代码。UI 线程对一个名为 Dispatcher 的对象内的工作项进行排队。 Dispatcher 基于优先级选择工作项,并运行每一个工作项直到完原创 2020-12-15 13:42:35 · 684 阅读 · 0 评论 -
C# 之重写应用的 Main() 入口函数
▪ 前言之前做过 WinForm 开发的朋友一定很熟悉,我们的应用程序都是从 Program.cs 的一个 Main 方法开始的。但是在 WPF 中,Main 函数在项目生成的时候,系统自动在后台为我们生成。根据项目生成方式的不同,其文件位于 obj/Debug/App.g.cs 或者 obj/Release/App.g.cs。Main() 函数主要功能就是实例化应用主体,并自动根据 App.xaml 文件内的 StartupUri 参数启用第一个窗口(默认为 MainWindow.xaml)那么,原创 2020-12-15 13:42:04 · 1302 阅读 · 0 评论 -
C# 之 DataTable 详解
▪ 添加引用using System.Data;▪ 创建表// 方法一:创建一个空表DataTable dt = new DataTable();// 方法二:创建一个名为"admin"的空表DataTable dt = new DataTable("admin");▪ 创建列// 方法一:创建空列DataColumn dc = new DataColumn();dt.Columns.Add(dc);// 方法二:创建带列名和类型名的列dt.Columns.Add("pass原创 2020-12-15 13:41:25 · 2058 阅读 · 1 评论