使用100%缩放比例重新启动Visual Studio 界面模糊的解决方案
问题描述建议:如果是刚开始写WinForm项目 ,建议刚开始就去进行一个替换 ,要不然后面会很麻烦的 ,不仅要计算size 还要去 计算 location 的值
昨天碰到了这个问题 ,当时设置完之后界面就非常的模糊 ,虽然说界面变大了 ,但是看着异常难受 ,很模糊
解决方案
新建应用程序清单文件(Application Manifest File) , 保持默认名称 app.manifest,点击添加。
找到这段代码:
12345<application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> </windowsSettings></application>
替换DPI相关配置:
1234 ...
WPF数据验证与错误提示学习笔记
面向已经会写绑定、写过转换器的读者,这一篇把「输入错了怎么办」这件事从头讲清楚。推荐环境:.NET 10 LTS + WPF。随附示例使用 net9.0-windows,以便在已安装 .NET 9 SDK 的电脑上直接编译;用到的验证机制在 .NET 9 和 .NET 10 中没有变化。最后更新:2026-10-20
目录
基于 IDataErrorInfo 的数据验证
IDataErrorInfo 中的属性判断
结合特性的属性验证过程
基于正则表达式的数据验证
结合异常信息提示的输入框模板
写在前面这份笔记解决什么问题上一篇笔记讲的是转换器和 ValidationRule,重点在「怎么把值翻译过去」和「怎么拦住不合法的值」。这一篇换个角度,专门讲数据对象自己怎么报告错误,以及界面怎么把这些错误显示出来。
具体回答六个问题:
123456模型实现 IDataErrorInfo 之后,WPF 到底在什么时候调用它?索引器里的 columnName 是什么?为什么有时校验根本不触发?属性上写 [Required]、[Range] 这些特性,WPF 会自动认吗?正则校验为什么容易「看 ...
WPF转换器与数据校验学习笔记
面向已经练过绑定基础、准备把「数据和界面之间的翻译」这件事做扎实的读者。推荐环境:.NET 10 LTS + WPF。随附示例使用 net9.0-windows,以便在当前安装了 .NET 9 SDK 的电脑上直接编译。这里用到的转换与校验机制在 .NET 9 和 .NET 10 中没有变化。最后更新:2026-10-20
目录
系统默认 ValueConverter
ConverterParameter 的使用
基于 Converter 的性别绑定案例
FallbackValue 与 TargetNullValue 属性
绑定数据异常与捕获
自定义 ValidationRule
写在前面这份笔记解决什么问题前一篇笔记讲的是绑定的五个可配置项,其中已经用过 Converter。但那时的重点是「转换器放在链路的什么位置」,这一篇要往下走一层,回答几个更具体的问题:
123456不写转换器的时候,界面到底是怎么把 1234.5 变成文字的?所有类型都能变吗?ConverterParameter 传进来是什么类型?为什么我传了数字却当成字符串用了?两个单选按钮怎么绑同一个「性别」字段 ...
WPF绑定细节与常见问题学习笔记
面向已经练过数据绑定和数据源,准备把绑定写稳、写准、写顺的读者。推荐环境:.NET 10 LTS + WPF。随附示例使用 net9.0-windows,以便在当前安装了 .NET 9 SDK 的电脑上直接编译。这里用到的绑定机制在 .NET 9 和 .NET 10 中没有变化。最后更新:2026-10-20
目录
绑定常见问题处理:相对源与多级联动问题
绑定对象的 Mode 属性
绑定对象的 UpdateSourceTrigger 与 Delay 属性
绑定对象的 StringFormat 属性
绑定对象的 Converter 属性
写在前面这份笔记解决什么问题前面几篇笔记把绑定的主干讲完了:值和界面怎么连、来源从哪里来、模板怎么用、列表怎么呈现。到这一步,大部分界面都能写出来了。
但真正开始写业务界面以后,问题往往不是「绑不上」,而是「绑上了但不对劲」:
12345模板里想用外面的数据,路径写对了却一直空白,为什么?同一个属性,有时候界面改不动来源,有时候又改得动,差别在哪?文本框每敲一个字就触发一次查询,太频繁了,能不能等一下再触发?金额显示成 1234.5,想要 $1, ...
WPF列表控件与集合呈现学习笔记
面向已经练过依赖属性、数据绑定和数据模板,准备系统学习列表控件与集合呈现的读者。推荐环境:.NET 10 LTS + WPF。随附示例使用 net9.0-windows,以便在当前安装了 .NET 9 SDK 的电脑上直接编译。这里用到的列表控件、模板和绑定机制在 .NET 9 和 .NET 10 中没有变化。最后更新:2026-10-19
目录
列表控件的子项结构区别
集合子项模板与数据模板的组合使用
数据集合的不同呈现方式
ComboBox 的绑定使用
多级数据联动案例
写在前面这份笔记解决什么问题前面五篇笔记走完了一条从属性到界面的路:
笔记
回答的问题
WPF 依赖属性学习笔记
属性怎样参与 WPF 的值系统
WPF 依赖属性进阶笔记
元数据、属性值继承和附加属性
WPF 数据绑定学习笔记
绑定怎样把值和界面连起来
WPF 绑定数据源学习笔记
绑定表达式里的来源对象从哪里来
WPF 数据模板与集合绑定学习笔记
一份数据怎样用不同外观呈现
到这里,你已经能让数据显示出来了。可一旦动手写真正的业务界面,问题马上变成另一批:
12345同样是显 ...
WPF数据模板与集合绑定学习笔记
面向已经完成基础数据绑定练习,准备学习尺寸均分、多区域联动、集合呈现和数据模板的读者。推荐环境:.NET 10 LTS + WPF。随附示例使用 net9.0-windows,以便在当前安装了 .NET 9 SDK 的电脑上直接编译。这里用到的布局、绑定和模板机制在 .NET 9 和 .NET 10 中没有变化。最后更新:2026-10-19
目录
基于界面控件绑定的尺寸均分处理
多区域整合绑定的数据关系
集合数据类型的绑定与数据呈现
数据模板触发器
数据模板选择器
基于数据集合绑定的直方图案例
写在前面这份笔记解决什么问题前面四篇笔记走完了一条完整的路:
笔记
回答的问题
WPF 依赖属性学习笔记
属性怎样参与 WPF 的值系统
WPF 依赖属性进阶笔记
元数据、属性值继承和附加属性
WPF 数据绑定学习笔记
绑定怎样把值和界面连起来
WPF 绑定数据源学习笔记
绑定表达式里的来源对象从哪里来
到这里,语法已经够用了,但真正动手写界面时还会遇到新的问题:
1234三列宽度怎样自动均分,不用手算?左边选了部门,中间和右边怎样自动跟着变?一个集合,怎样 ...
WPF绑定数据源学习笔记
面向已经完成基础数据绑定练习,准备继续学习数据源提供器、XML、DataContext 和 RelativeSource 的读者。推荐环境:.NET 10 LTS + WPF。随附示例使用 net9.0-windows,以便在当前安装了 .NET 9 SDK 的电脑上直接编译。这里用到的绑定机制在 .NET 9 和 .NET 10 中没有变化。最后更新:2026-10-19
目录
基于对象方法的数据源使用
基于 XML 数据的数据源使用
DataContext 数据源使用
RelativeSource 数据源使用
RelativeSource 对象参数说明
写在前面这份笔记解决什么问题前一篇《WPF 数据绑定学习笔记》回答的是“绑定怎样把值和界面连起来”。这一篇继续回答一个更具体的问题:
1绑定表达式里的来源对象,到底从哪里来?
同样一句:
1<TextBlock Text="{Binding Name}" />
在不同位置可能从 DataContext 取数据,也可能从资源里的方法返回值、XML 节点或某个祖先控件取数据 ...
WPF数据绑定学习笔记
面向已经了解 WPF 基本控件和依赖属性,准备系统学习数据绑定的读者。推荐环境:.NET 10 LTS + WPF。随附示例使用 net9.0-windows,以便在当前安装了 .NET 9 SDK 的电脑上直接编译。数据绑定机制在 .NET 9 和 .NET 10 中没有变化。最后更新:2026-10-19
目录
数据绑定的基本关系
基于依赖对象的数据绑定
基于普通数据类型的数据绑定
基于对象的数据绑定
基于ADO.NET的数据绑定
基于Linq的数据绑定
写在前面这份笔记怎么用这份笔记有三种阅读方式:
路线
做法
适合情况
直接运行
打开随附示例,逐个切换六个页签
想先看到效果
逐步跟做
从第 1 章开始,在同一个 WPF 项目中添加代码
想亲手敲一遍
按需查阅
直接阅读对应来源类型的章节
已经遇到具体绑定问题
建议至少完成第 1 章,因为后面的所有示例都建立在同一套绑定语法上。
示例项目位置1C:\Users\North\Desktop\WPF学习笔记\示例代码\WpfDataBindingDemo
运行方式:
123cd "C:\Us ...
WPF依赖属性学习笔记
面向刚开始学习 WPF 的读者。推荐环境:.NET 10 LTS + WPF。示例项目为了能在当前只安装了 .NET 9 SDK 的机器上直接编译,目标框架写成了 net9.0-windows。依赖属性的写法在 .NET 9 和 .NET 10 中没有变化,把目标框架改一行即可。最后更新:2026-10-19
目录
依赖属性的声明
依赖属性的注册
依赖属性的值变化回调
依赖属性的值验证回调
依赖属性的值强置回调
自定义容器的依赖属性改造
写在前面这份笔记怎么用这份笔记有两种用法,可以任选一种:
路线
做法
适合情况
跟做路线
新建一个 WPF 项目,从第 1 章开始逐步加入代码
想亲手敲一遍
对照路线
直接打开随附示例,运行后对照章节阅读
想先看到效果
无论选择哪条路线,都建议按照下面的顺序操作:
先运行程序,观察界面变化。
再看调试输出,确认回调确实被调用了。
最后回到代码,理解每个参数和回调的职责。
示例项目位置:
1C:\Users\North\Desktop\WPF学习笔记\示例代码\WpfDependencyPropertyDemo
示例项目 ...
WPF依赖属性进阶笔记
WPF 依赖属性进阶学习笔记
面向已经写过一两个依赖属性,准备继续学习元数据、继承和附加属性的读者。推荐环境:.NET 10 LTS + WPF。随附示例使用 net9.0-windows,以便在当前安装了 .NET 9 SDK 的电脑上直接编译。依赖属性机制在 .NET 9 和 .NET 10 中没有变化。最后更新:2026-10-19
目录
依赖属性的元数据选项
依赖属性的继承
依赖附加属性的定义
依赖附加属性的应用
写在前面这份笔记和上一篇的关系上一篇《WPF 依赖属性学习笔记》解决的是“怎样把一个普通属性改造成依赖属性”:
1声明 -> 注册 -> 变化回调 -> 验证回调 -> 强制回调
这一篇继续向前一步,解决的是“依赖属性怎样和 WPF 的其他机制配合”:
本篇主题
回答的问题
元数据选项
属性变化后,WPF 应该自动做什么
属性值继承
值怎样从祖先元素流向子孙元素
附加属性定义
怎样给“别人的元素”增加一个属性
附加属性应用
附加属性怎样在 XAML、C# 和容器布局中工作
如果上一篇还没有读过,建议先完成其中 ...
未命名
测试下看看
CSharp中的ref和out关键字使用
ref 是双向传递,out 是只出不进。
ref 和 out 都是用在方法参数上的关键字,用来改变「参数传递」的方式。之前你在 TryParse 里已经见过 out 了,这篇把 ref 和 out 一起讲清楚。
一、先搞清楚:默认是「复制一份」方法参数默认按值传递,等于复制一份。
先看一段代码,理解默认行为:
12345678910111213141516using System;class Program{ static void Main() { int x = 10; Change(x); // 把 x 传进去 Console.WriteLine(x); // 还是 10,没变! } static void Change(int n) { n = 999; // 改的是 n,不是 x }}
运行结果是 10,不是 999。因为传参时,只是把 x ...
CSharp字符串与数值类型相互转换
字符串和数字互相转换,上位机几乎天天要用。
为什么需要互转?因为两边的「身份」不一样。
界面输入框里,用户敲进 25.6,程序拿到的是字符串 string,不是数字,没法直接做加减乘除。
PLC 通过 Modbus 传来的温度是数字,但显示到屏幕上、写进日志里,又得变成字符串。
所以必须学会两个方向:数字变字符串、字符串变数字。
本篇目标:会用 ToString 把数字变字符串,会用 Parse、TryParse 把字符串变数字,知道字符串转数字最大的坑,能用 TryParse 写出不崩溃的代码。
一、数值转字符串(简单方向)数字变字符串很简单,两个办法。
办法一:用加号拼接1234567891011121314151617using System;class Program{ static void Main() { double temp = 25.6; int count = 100; // 数字和字符串用 + 连,数字自动变成字符串 string s1 = " ...
CSharp数值类型的自动转换和强制转换
类型转换就是把一种类型的数据,变成另一种类型。
上位机里这种需求天天有:PLC 读上来的原始值常常是 int,换算工程量要用 double,算完又要显示成文字给操作员看。这一路就得不断做类型转换。这篇就讲两种转换:自动转换和强制转换。
本篇目标:分清「自动转换」和「强制转换」什么时候发生、会不会丢数据,能自己写转换代码,知道两个最容易踩的坑。
一、先打个比方:大杯子和杯子记住这个比喻,整篇都靠它。
想象两个杯子:
小杯子倒进 大杯子:水不会洒,安全,随便倒。
大杯子倒进 小杯子:水会溢出来,你得自己小心,还可能洒掉。
类型转换一模一样。范围小的类型(比如 byte)转成范围大的类型(比如 int),就像小杯子倒大杯子,安全;反过来范围大的转范围小的,就像大杯子倒小杯子,可能丢数据。
二、自动转换(隐式转换)自动转换就是「小转大」,电脑自动帮你完成,不用写任何东西,也不会丢数据。
1234567891011121314151617using System;class Program{ static void Main() { ...












