在WPF程序中实现PropertyGrid功能

news/2025/2/27 19:49:56/文章来源:https://www.cnblogs.com/hsiang/p/18559720

使用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功能》的全部内容,旨在抛砖引玉,一起学习,共同进步。

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

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

相关文章

2024-2025-1 20241322 《计算机基础与程序设计》 第九周学习总结

2024-2025-1 20241322 《计算机基础与程序设计》 第九周学习总结 作业信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK09这个作业的目标 - 操作系统责任 - 内存与进程…

记一次复杂sql涉及到的sql语法

这是一个报表的sql查询,查询销售员的业绩分析. 一、表说明customer:客户表,客户与销售人员(通过 salesman_id)关联。 sale_contract :销售合同表 user:用户表(销售人员表),包含字段如 real_name(姓名)、post_id(职位ID)、dept_id(部门ID)。 post:销售人员的职位信…

Java大作业5-6次总结

第一次迭代总体来说不难分析。它每个控制器和受控制器都是独立的,设计完之后就可以像拼积木那样来完成项目。感觉是封装思想的经典例题。 在进行类的设计时,由于题目中描述的类的实现采用的是元器件拼音首字母,因此为了方便记忆,我也使用了对应的拼音来定义类。这在实际使用…

一文梳理获取本地IP和远程IP的各种方式,附Python代码实例

本地 IP 是指设备在本地网络(如家庭、办公室局域网)中被分配的IP地址,用于在该局域网内设备之间的通信和识别,一般由路由器分配。远程 IP 则是互联网上其它网络或服务器的 IP 地址,用于设备与外部网络通信,如访问网站时的服务器 IP。 获取本地IP地址 1. 系统设置查看其中…

程序设计实验4

任务1 task1_1.cpp1 #include <iostream>2 3 using std::cout;4 using std::endl;5 6 // 类A的定义7 class A {8 public:9 A(int x0, int y0); 10 void display() const; 11 12 private: 13 int x, y; 14 }; 15 16 A::A(int x0, int y0): x{x0}, y{y0} { 1…

2024 Notepad++最新版官网中文版与安装教程

前言 Notepad (记事本)是一个简单的文本编辑器,预装在所有版本的 Microsoft Windows 操作系统中。它的主要功能是创建、编辑和存储纯文本文件,通常以 .txt 格式保存。Notepad 的设计旨在提供一个轻量级的文本处理工具,适合快速编辑和查看文本内容。 基于 Notepad,Notepad…

宝塔面板MySQL无法启动的解决办法

如果你也使用宝塔面板,并且恰好遇到 MySQL 无法启动的情况,那么我猜你大概率是使用了宝塔面板中 MySQL 管理中的“性能调整”功能,因为子凡我已经在这里栽跟头好几次了,今天就简单的给大家分享一下解决办法。宝塔面板 MySQL 数据库无法启动或重启失败的主要问题就是由于 qu…

Computer Vision

Computer Vision https://zhuanlan.zhihu.com/p/444208711.1 概念 计算机视觉(Computer Vision)是研究计算机如何像人类视觉系统 一样,从数字图像或视频中理解其高层内涵的一门学科,简言之就是研究如何让计算机看懂世界,由于它包括对数字图像或视频进行预处理、特征提取、特…

学习笔记(四十二):自定义组件@BuilderParam装饰器

概述: 该装饰器用于声明任意UI描述的一个元素,类似slot占位符。使用示例: 1、初始化@BuilderParam装饰的方法// 自定义组件 @Component export struct CommonView{@Builder customBuilder() {}; // 当前组件@BuilderParam customBuilderParam: () => void = this.customB…

Python创建虚拟环境报错:Error: Command......

目录环境说明问题描述原因分析解决方法 环境说明系统# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.4 LTS Release: 22.04 Codename: jammyPython版本# python3 --version Python 3.13.0问题描述 使用 ve…

使用Redis来实现在线人数的查看

使用Redis来实现在线人数的查看在学习程序员老罗的easylive项目当中,遇到了一个对我现阶段来说很有意思的功能,那就是实现在线人数查看的功能,我第一次接触到这个功能是在学习WebServlet的监听器的时候.那时候是使用Listener监听器的Session事件和Context的生命周期来实现这个功…

PDF 转 HTML API 数据接口

PDF 转 HTML API 数据接口 文件处理 / PDF 高效 PDF 转 HTML 工具 生成HTML站点 / 可永久存储。1. 产品功能高效处理大文件; 支持多语言字符识别; 支持 formdata 格式 PDF 文件流传参; 输出文件永久 CDN 存储; 输出可直接访问的 HTML 站点; 全接口支持 HTTPS(TLS v1.0 / …