在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命名空间,如下所示:

XML 复制代码
<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中才能正确显示,如下所示:

XML 复制代码
<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

cs 复制代码
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,如下所示:

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

相关推荐
tobebetter95275 小时前
How to manage python versions on windows
开发语言·windows·python
多多*6 小时前
Java复习 操作系统原理 计算机网络相关 2025年11月23日
java·开发语言·网络·算法·spring·microsoft·maven
q***71856 小时前
windows下安装并使用node.js
windows·node.js
q***92518 小时前
Windows上安装Go并配置环境变量(图文步骤)
开发语言·windows·golang
网易智企8 小时前
智能玩具新纪元:一个AI能力底座开启创新“加速度”
人工智能·microsoft
凭栏落花侧10 小时前
打印机脱机状态应该怎么处理
windows
q***577411 小时前
MySQL 实验1:Windows 环境下 MySQL5.5 安装与配置
windows·mysql·adb
dotent·11 小时前
C#基于WPF UI框架的通用基础上位机测试WPF框架
ui·c#·wpf
q***318311 小时前
Windows安装Rust环境(详细教程)
开发语言·windows·rust
合作小小程序员小小店11 小时前
桌面开发,超市管理系统开发,基于C#,winform,sql server数据库
开发语言·数据库·sql·microsoft·sqlserver·c#