在WPF程序中实现PropertyGrid功能
使用C#开发过Windows Forms的都知道,在Windows Forms程序中,有一个PropertyGrid控件,可以用于显示对象的属性,在WPF中并没有默认提供此功能的控件,今天以一个简单的小例子,简述在WPF中借助WinForm的PropertyGrid实现属性列表功能,仅供学习分享使用,如有不足之处,还请指正。
涉及知识点
- PropertyGrid 是.NET中属性浏览器的核心,PropertyGrid控件显示任何对象或类型的属性,并检索项的属性。PropertyGrid一般用在Windows Forms程序中,在WPF程序中,可以通过自定义控件实现,也可以借助WindowsFormsHost控件,将Windows Forms中的控件,宿主到WPF程序中。
- WindowsFormsHost,一个WPF控件,允许允许在 WPF 程序上托管 Windows Forms控件。反过来,若要在 Windows 窗体控件或窗体中承载 WPF 元素,请使用 控件 ElementHost 。
PropertyGrid简介
PropertyGrid最常用属性,如下所示:
- SelectedObject,设置PropertyGrid控件选择的对象,赋值后,控件将显示对象所有public修饰的属性。
- SelectedObjects,设置PropertyGrid控件显示的对象列表,为数组类型。赋值后,将显示所有对象公共的public修饰的属性。
除了上述两个最常用属性,PropertyGrid还有其他属性,如下所示:
- BackColor 更改其背景色。
- HelpBackColor 更改助窗口背景色。
- HelpForeColor 更改助窗口字体颜色。
- HelpVisible 显示隐藏帮助窗口。
- ToolbarVisible 显示隐藏工具栏。
- LargeButtons 显示大型工具栏按钮。
- PropertySort 按字母顺序对属性进行排序。
- BackColor 更改拆分器颜色。
- LineColor 更改网格线和边框。
PropertyGrid支持的对象属性注解,如下所示:
- DescriptionAttribute - 设置属性在属性下方的说明帮助窗格中显示的属性的文本。 这是为具有焦点的活动属性提供帮助文本的有用方法。 将此属性应用于 MaxRepeatRate 该属性。
- CategoryAttribute 设置属性在网格中所属的类别。 当需要按类别名称分组的属性时,这非常有用。 如果属性未指定类别,则会将其分配给 Misc 类别。 将此属性应用于所有属性。
- BrowsableAttribute – 指示属性是否显示在网格中。 如果要从网格中隐藏属性,这非常有用。 默认情况下,公共属性始终显示在网格中。 将此属性应用于 SettingsChanged 该属性。
- ReadOnlyAttribute – 指示属性是否为只读。 如果要使属性在网格中不可编辑,这非常有用。 默认情况下,具有 get 和 set 访问器函数的公共属性在网格中可编辑。 将此属性应用于 AppVersion 该属性。
- DefaultValueAttribute – 标识属性的默认值。 如果想要为属性提供默认值,然后确定该属性的值是否不同于默认值,则这非常有用。 将此属性应用于所有属性。
- DefaultPropertyAttribute – 标识类的默认属性。 类的默认属性在网格中选择类时首先获取焦点。 将此属性应用于 AppSettings 类。
- DisplayNameAttribute - 实际显示的名称
通过上述注解,可以显示属性在PropertyGrid中的说明或者其他内容。
PropertyGrid控件目前支持.NET Framework和Windows Desktop版本,如下所示:

开发步骤
1. 检查类库
首先检查项目中是否引用【Microsoft.WindowsDesktop.App】框架,在此框架中,会包含【System.Windows.Forms】,若没有,需要手动添加,如下图所示:

2. 引用命名空间
在项目中需要添加PropertyGrid的页面,添加System.Windows.Forms命名空间,如下所示:
<Window x:Class="HelloWorld.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:HelloWorld"xmlns:winfm="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800">
</Window>
3. 添加PropertyGrid控件
由于PropertyGrid是Winodws Forms中的控件,并不能在WPF中直接使用,需要托管到WindowsFormsHost中才能正确显示,如下所示:
<Grid><Grid.ColumnDefinitions><ColumnDefinition></ColumnDefinition><ColumnDefinition></ColumnDefinition></Grid.ColumnDefinitions><Button x:Name="btnHelloWorld" Content="Click Say Hello World"Width="150" Height="30" Click="btnHelloWorld_Click"></Button><WindowsFormsHost Grid.Column="1" Margin="18,12,0,0" Name="windowsFormsHost1" VerticalAlignment="Top"><winfm:PropertyGrid x:Name="propertyGrid"></winfm:PropertyGrid></WindowsFormsHost>
</Grid>
4. 设置对象
通过SelectedObject属性为PropertyGrid赋值,由于PropertyGrid属性并不是WPF中的依赖对象,所以不能进行绑定,但可以通过后台C#代码进行赋值。如下所示:
定义测试类Person
public class Person
{[Category("Person")][DisplayName("标识")][Description("唯一标识")]public int Id { get; set; }[Category("Person")][DisplayName("名称")][Description("名称")]public string Name { get; set; }[Category("Person")]public string Title { get; set; }[Category("Person")]public string Description { get; set; }[Category("Person")]public int Age { get; set; }
}
声明Person对象并赋值给PropertyGrid,如下所示:
public MainWindow()
{InitializeComponent();var p = new Person{Id = 1,Name = "老码识途",Age = 20,Description = "这是一个人",Title = "老码识途作者"};this.propertyGrid.SelectedObject = p;
}
实例演示
通过上述步骤,就可以实现PropertyGrid属性框的功能,本例将Person的作为要显示属性的对象赋值给PropertyGrid,如下所示:

注意,如果没有为属性设置Category,则默认为Misc。
以上就是《在WPF程序中实现PropertyGrid功能》的全部内容,旨在抛砖引玉,一起学习,共同进步。
相关文章:
在WPF程序中实现PropertyGrid功能
使用C#开发过Windows Forms的都知道,在Windows Forms程序中,有一个PropertyGrid控件,可以用于显示对象的属性,在WPF中并没有默认提供此功能的控件,今天以一个简单的小例子,简述在WPF中借助WinForm的Propert…...
【R语言管理】Pycharm配置R语言及使用Anaconda管理R语言虚拟环境
目录 使用Anaconda创建R语言虚拟环境1. 安装Anaconda2. 创建R语言虚拟环境 Pycharm配置R语言1. 安装Pycharm2. R Language for IntelliJ插件 参考 使用Anaconda创建R语言虚拟环境 1. 安装Anaconda Anaconda的安装可参见另一博客-【Python环境管理工具】Anaconda安装及使用教程…...
.Net与C#
.NET 与 C# 的关系 .NET 是一个由微软开发的软件框架,它提供了一套用于开发、运行和部署应用程序的工具和库。C# 是一种面向对象的编程语言,它是专门为.NET平台设计的。以下是.NET与C#之间关系的详细说明: 目标平台:C# 是.NET平…...
使用ElementUI中的el-table制作可编辑的表格
在前端开发时,可能会需要用到可编辑的表格控件。一些原生的UI框架并不支持Table控件的可编辑功能,所以只能自己实现。 以下用Vue3Element-Plus进行示例开发。 一、实现可编辑的单元格 我想要实现的效果是,鼠标移动到el-table的某行时&…...
开放性技术的面试题该如何应对?
1. 上线出现问题如何解决? 步骤: 立即响应:迅速确认问题的存在和影响范围。回滚:如果问题严重影响用户,考虑立即回滚到上一个稳定版本。日志分析:查看服务器日志、应用日志和前端日志,定位问题…...
Leetcode 面试150题 88.合并两个有序数组 简单
系列博客目录 文章目录 系列博客目录88. 合并两个有序数组 简单示例 1:示例 2:示例 3:提示:问题: 88. 合并两个有序数组 简单 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n,分别表示 nums1 和 nums2 中的元素数目。 请你…...
CGAL CGAL::Polygon_mesh_processing::self_intersections解析
CGAL::Polygon_mesh_processing::self_intersections 是用于检测多边形网格(Polygon Mesh)中的自相交的函数。自相交是指网格中的某些面(例如三角形)与同一网格中的其他面交叉的情况。这种情况通常是不期望的,因为它会…...
esp32触发相机
esp32触发相机,测试成功上升沿触发 串口发送命令 up 20000 1 20000 触发 #include <Arduino.h>const int outputPin 12; // 输出引脚 String inputCommand ""; // 串口输入缓冲区// 解析命令参数,例如 "up 10 5" 解析为…...
webrtc支持h265
Webrtc播放H265的技术探索(datachannelwasm) - 飞翔天空energy - 博客园 https://github.com/ZLMediaKit/ZLMediaKit/issues/3589 [技术咨询]addStreamProxy 添加拉流代理之后,webrtc协议无法播放,其它协议正常 Issue #1808 ZLMediaKit/ZLMediaKit G…...
macos 14.0 Monoma 修改顶部菜单栏颜色
macos 14.0 设置暗色后顶部菜单栏还维持浅色,与整体不协调。 修改方式如下:...
在 Mac(ARM 架构)上安装 JDK 8 环境
文章目录 步骤 1:检查系统版本步骤 2:下载支持 ARM 的 JDK 8步骤 3:安装 JDK步骤 4:配置环境变量步骤 5:验证安装步骤 6:注意事项步骤7:查看Java的安装路径 在 Mac(ARM 架构…...
Linux高阶——1123—
1、服务器版本介绍及实现 1、单进程单任务服务器(阻塞IO) 单进程模型,阻塞IO冲突,等待连接时无法读取数据,读取数据时无法连接 比较适合处理单任务,排队处理业务 伪代码 while(true) {addrlensizeof(c…...
VOLO实战:使用VOLO实现图像分类任务(二)
文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…...
【kafka02】消息队列与微服务之Kafka部署
Kafka 部署 Kafka 部署说明 kafka 版本选择 kafka 基于scala语言实现,所以使用kafka需要指定scala的相应的版本.kafka 为多个版本的Scala构建。这仅在使用 Scala 时才重要,并且希望为使用的相同 Scala 版本构建一个版本。否则,任何版本都可以 kafka下…...
MySQL系列之数据类型(Numeric)
导览 前言一、数值类型综述二、数值类型详解1. NUMERIC1.1 UNSIGNED或SIGNED1.2 数据类型划分 2. Integer类型取值和存储要求3. Fixed-Point类型取值和存储要求4. Floating-Point类型取值和存储要求 结语精彩回放 前言 MySQL系列最近三篇均关注了和我们日常工作或学习密切相关…...
BERT简单理解;双向编码器优势
目录 BERT简单理解 一、BERT模型简单理解 二、BERT模型使用举例 三、BERT模型的优势 双向编码器优势 BERT简单理解 (Bidirectional Encoder Representations from Transformers)模型是一种预训练的自然语言处理(NLP)模型,由Google于2018年推出。以下是对BERT模型的简…...
LLamafactory 批量推理与异步 API 调用效率对比实测
背景 在阅读 LLamafactory 的文档时候,发现它支持批量推理: 推理.https://llamafactory.readthedocs.io/zh-cn/latest/getting_started/inference.html 。 于是便想测试一下,它的批量推理速度有多快。本文实现了 下述两种的大模型推理,并对…...
spf算法、三类LSA、区间防环路机制/规则、虚连接
1.构建spf树: 路由器将自己作为最短路经树的树根根据Router-LSA和Network-LSA中的拓扑信息,依次将Cost值最小的路由器添加到SPF树中。路由器以Router ID或者DR标识。广播网络中DR和其所连接路由器的Cost值为0。SPF树中只有单向的最短路径,保证了OSPF区域内路由计管不…...
C语言学习 12(指针学习1)
一.内存和地址 1.内存 在讲内存和地址之前,我们想有个⽣活中的案例: 假设有⼀栋宿舍楼,把你放在楼⾥,楼上有100个房间,但是房间没有编号,你的⼀个朋友来找你玩,如果想找到你,就得挨…...
TypeError: issubclass() arg 1 must be a class
TypeError: issubclass() arg 1 must be a class 报错代码: import spacy 原因: 库版本错误, 解决方法: pip install typing-inspect0.8.0 typing_extensions4.5.0 感谢作者: langchain TypeError: issubclass() …...
智慧医疗泡罩药板药片缺失缺陷检测数据集VOC+YOLO格式1300张3类别
注意数据集中图片大约500张是原图剩余为增强图片数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):1300标注数量(xml文件个数):1300…...
十 438. 找到字符串中所有字母异位词
438. 找到字符串中所有字母异位词https://leetcode.cn/problems/find-all-anagrams-in-a-string/ 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s "cbaebabacd"…...
Gepetto核心工具详解:函数反编译、变量重命名与代码注释
Gepetto核心工具详解:函数反编译、变量重命名与代码注释 【免费下载链接】Gepetto IDA plugin which queries OpenAIs gpt-3.5-turbo language model to speed up reverse-engineering 项目地址: https://gitcode.com/gh_mirrors/ge/Gepetto Gepetto是一款集…...
RWKV7-1.5B-g1a参数详解教程:temperature/top_p/max_new_tokens调优指南
RWKV7-1.5B-g1a参数详解教程:temperature/top_p/max_new_tokens调优指南 1. 模型简介 rwkv7-1.5B-g1a 是基于 RWKV-7 架构的多语言文本生成模型,特别适合以下场景: 基础问答文案续写简短总结轻量中文对话 这个模型在单卡 24GB 显存的设备上…...
如何高效使用开源工具:3个实战技巧快速上手WebPlotDigitizer图表数据提取
如何高效使用开源工具:3个实战技巧快速上手WebPlotDigitizer图表数据提取 【免费下载链接】WebPlotDigitizer WebPlotDigitizer: 一个基于 Web 的工具,用于从图形图像中提取数值数据,支持 XY、极地、三角图和地图。 项目地址: https://gitc…...
wflow工作流设计器:5分钟快速上手的企业流程自动化完整指南
wflow工作流设计器:5分钟快速上手的企业流程自动化完整指南 【免费下载链接】wflow workflow 工作流设计器,企业OA流程设计。表单流程设计界面操作超级简单!!普通用户也能分分钟上手,不需要专业知识。本设计器支持可视…...
基于MATLAB的模拟退火粒子群算法在含分布式电源配电网多目标优化中的应用
310.基于matlab的模拟退火粒子群算法对含分布式电源的配电网进行多目标优化,目标函数包括总有功网损、总投资与运行成本、电压稳定欲度。 和目标函数相关参数有单位分布式电源投资成本、运行成本,分布式电源设备使用年限、贴现率等。 经过优化得到最佳结…...
智能工单管理系统 2026 怎么挑?五款热门平台对比,适配企业各类业务场景
工单智能化应用:帮您告别工单苦海 传统工单系统的痛点,本质是信息处理效率与用户体验的矛盾。随着AI 的发展,工单智能化应用的核心逻辑转变为,通过AI技术将“人找信息”转变为“信息找人”,甚至“预测需求”。 工单管…...
Nimbus:一个统一的具身合成数据生成框架
Zeyu He, Yuchang Zhang, Yuanzhen Zhou, Miao Tao, Hengjie Li,∗, Hui Wang, Yang Tian, Jia Zeng, Tai Wang, Wenzhe Cai, Yilun Chen, Ning Gao, Jiangmiao Pang摘要扩大数据规模和多样性对于泛化具身智能至关重要。虽然合成数据生成为昂贵的物理数据采集提供了可扩展的替代…...
避坑指南:用ESP32驱动LD2420毫米波雷达时,串口数据丢失和自动开机卡死的那些事儿
ESP32与LD2420毫米波雷达深度避坑实战:从数据丢失到系统卡死的全链路解决方案 当你在凌晨三点盯着逻辑分析仪上那些残缺的串口波形时,就会明白为什么LD2420毫米波雷达被称为"最熟悉的陌生人"。这个能穿透墙壁感知呼吸的24GHz传感器,…...
