由于WPF中没有提供PropertyGrid控件,有些业务需要此类的控件。这篇文章介绍在WPF中实现PropertyGrid的三种方式,三种方式都是俺平时使用时总结出来的。

  第一种方式:使用WindowsForm的PropertyGrid控件。

用过WPF的童鞋都晓得,可以通过WindowsFormsHost将WindowsForm的控件宿主到WPF中使用。很简单,分为简单的3步。

第一步:引用dll:在WPF应用程序中引入System.Windows.Forms.dll。

第二步:引用命名空间:在窗体的.cs代码中引用此命名空间:using System.Windows.Forms;在XAML中引用此命名空间代码如下:

xmlns:my="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

第三步:通过WindowsFormsHost使用PropertyGrid控件。 

代码

<WindowsFormsHost Height="287" HorizontalAlignment="Left" Margin="18,12,0,0" Name="windowsFormsHost1" VerticalAlignment="Top" Width="200">
<my:PropertyGrid x:Name="PropertyGrid1"></my:PropertyGrid>
</WindowsFormsHost>

看下效果Button的属性:

将Button的背景色设置为红色:

第二种方式:自定义WPF控件。这里以codeplex上的一个开源控件为例。如果你想知道实现的细节,可以到http://wpg.codeplex.com/上下载代码学习。

使用方式很简单。由于它是WPF控件,所以不需要使用WindowsFormsHost。

代码

<Window x:Class="WPGDemoApp.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpg="clr-namespace:WPG;assembly=WPG"
Title="Window1" Height="300" Width="300">
<DockPanel VerticalAlignment="Stretch">
<Button DockPanel.Dock="Top" x:Name="btn">button for test</Button>
<wpg:PropertyGrid DockPanel.Dock="Top" Instance="{Binding ElementName=btn}" VerticalAlignment="Stretch" IsEnabled="True"></wpg:PropertyGrid>
</DockPanel>
</Window>

把Button的背景色设置为红色:

第三种方式:使用WF4.0设计器里面的属性框控件。WF4.0的流程设计器有一个这样的PropertyGrid控件。我们利用它来实现自己的PropertyGrid控件。这也是本文重点介绍的方式。参考:Native WPF 4 PropertyGrid。分五个步骤去实现。

1、自定义一个用户控件,这个控件继承Grid类。grid将包含真正的界面元素。

2、用Workflow Foundation的WorkflowDesigner一个对象作为这个控件的私有成员。

3、对于需要设计的对象,在grid中添加一个PropertyInspectorView对象的子元素。对外它是一个Grid,其实它的类型是ProperyInspector。

4、通过反射获取和使用PropertyInspector的一些方法。

5、实现一个SelectedObject属性,标准的PropertyGrid都有它。用来处理PropertyInspector选择对象的改变。

代码如下:

代码

using System.Activities.Presentation;
using System.Activities.Presentation.Model;
using System.Activities.Presentation.View;
using System.Reflection;
using System.Windows.Controls;

namespace System.Windows.Control
{
///<summary>
/// WPF Native PropertyGrid class, taken from Workflow Foundation Designer
///</summary>
publicclass WpfPropertyGrid : Grid
{
#region Private fields
private WorkflowDesigner Designer;
private MethodInfo RefreshMethod;
private MethodInfo OnSelectionChangedMethod;
private TextBlock SelectionTypeLabel;
privateobject TheSelectedObject =null;
#endregion

#region Public properties
///<summary>
/// Get or sets the selected object. Can be null.
///</summary>
publicobject SelectedObject
{
get
{
returnthis.TheSelectedObject;
}
set
{
this.TheSelectedObject = value;

if (value !=null)
{
var context =new EditingContext();
var mtm =new ModelTreeManager(context);
mtm.Load(value);
var selection = Selection.Select(context, mtm.Root);

OnSelectionChangedMethod.Invoke(Designer.PropertyInspectorView, newobject[] { selection });
this.SelectionTypeLabel.Text = value.GetType().Name;
}
else
{
OnSelectionChangedMethod.Invoke(Designer.PropertyInspectorView, newobject[] { null });
this.SelectionTypeLabel.Text =string.Empty;
}
}
}

///<summary>
/// XAML information with PropertyGrid's font and color information
///</summary>
///<seealso>Documentation for WorkflowDesigner.PropertyInspectorFontAndColorData</seealso>
publicstring FontAndColorData
{
set
{
Designer.PropertyInspectorFontAndColorData = value;
}
}
#endregion

///<summary>
/// Default constructor, creates a hidden designer view and a property inspector
///</summary>
public WpfPropertyGrid()
{
this.Designer =new WorkflowDesigner();

var inspector = Designer.PropertyInspectorView;
Type inspectorType = inspector.GetType();

inspector.Visibility = Visibility.Visible;
this.Children.Add(inspector);

var methods = inspectorType.GetMethods(Reflection.BindingFlags.Public | Reflection.BindingFlags.NonPublic | Reflection.BindingFlags.Instance |
Reflection.BindingFlags.DeclaredOnly);

this.RefreshMethod = inspectorType.GetMethod("RefreshPropertyList",
Reflection.BindingFlags.NonPublic | Reflection.BindingFlags.Instance | Reflection.BindingFlags.DeclaredOnly);
this.OnSelectionChangedMethod = inspectorType.GetMethod("OnSelectionChanged",
Reflection.BindingFlags.Public | Reflection.BindingFlags.Instance | Reflection.BindingFlags.DeclaredOnly);
this.SelectionTypeLabel = inspectorType.GetMethod("get_SelectionTypeLabel",
Reflection.BindingFlags.Public | Reflection.BindingFlags.NonPublic | Reflection.BindingFlags.Instance |
Reflection.BindingFlags.DeclaredOnly).Invoke(inspector, newobject[0]) as TextBlock;

this.SelectionTypeLabel.Text =string.Empty;
}

///<summary>
/// Updates the PropertyGrid's properties
///</summary>
publicvoid RefreshPropertyList()
{
RefreshMethod.Invoke(Designer.PropertyInspectorView, newobject[] { false });
}
}
}

效果:

总结:本文提供了三种方式去在WPF中实现PropertyGrid。

代码:http://files.cnblogs.com/zhuqil/WpfPropertyGrid_Demo.rar

(全文完)


以下为广告部分

您部署的HTTPS网站安全吗?

如果您想看下您的网站HTTPS部署的是否安全,花1分钟时间来 myssl.com 检测以下吧。让您的HTTPS网站变得更安全!

SSL检测评估

快速了解HTTPS网站安全情况。

安全评级(A+、A、A-...)、行业合规检测、证书信息查看、证书链信息以及补完、服务器套件信息、证书兼容性检测等。

SSL证书工具

安装部署SSL证书变得更方便。

SSL证书内容查看、SSL证书格式转换、CSR在线生成、SSL私钥加解密、CAA检测等。

SSL漏洞检测

让服务器远离SSL证书漏洞侵扰

TLS ROBOT漏洞检测、心血漏洞检测、FREAK Attack漏洞检测、SSL Poodle漏洞检测、CCS注入漏洞检测。

WPF中实现PropertyGrid的三种方式相关推荐

  1. Django中Model继承的三种方式

    Django中Model继承的三种方式 Django中Model的继承有三种: 1.抽象继承 2.多表继承 3.proxy model(代理model) 1.抽象继承 第一种抽象继承,创建一个通用父类 ...

  2. android获取自定义属性,android 自定义控件中获取属性的三种方式(转)

    第一种方法,直接设置属性值,通过attrs.getAttributeResourceValue拿到这个属性值. (1)在xml文件中设置属性值 android:layout_width="f ...

  3. UE4学习-在虚幻编辑器中打开VS的三种方式

    文章目录 方式一 方式二 方式三 在虚幻编辑器中打开VS的三种方式 方式一 在文件浏览器这里,选择C++类,然后在文件夹内,找到一个和截图中类似的图标,双击,即打开vs,并在vs中打开这个类的代码. ...

  4. Java中实现接口的三种方式您造吗?

    本文介绍了Java中实现接口的三种方式:常规实现方式.匿名内部类和 Lambda表达式实现方式.希望已经了解的同学可以重新温习一下,不了解的同学则从中受益! Java中接口最常规的实现方式 同学们都会 ...

  5. java中实现多线程的三种方式

    java中实现多线程的三种方式 1.实现多线程的方法: 在java中实现多线程的两途径:继承Thread类,实现Runable接口(Callable) 2.继承Thread类实现多线程: ​ 继承类T ...

  6. java类初始数组_java中数组初始化的三种方式是什么

    java中数组初始化的三种方式是:1.静态初始化,如[int a[] = {2, 0, 1, 9, 2020}]:2.动态初始化,如[int[] c = new int[4]]:3.默认初始化,如[i ...

  7. 【查看linux中所有用户的三种方式】

    查看linux中所有用户的三种方式学习目标: 提示:通过使用 /etc/passwd 文件,getent 命令,compgen 命令这三种方法查看系统中用户的信息 用户信息存放位置: 提示:Linux ...

  8. java中Map遍历的三种方式

    Java中Map遍历的三种方式 前言 一:在for循环中使用entries实现Map的遍历: 二:在for循环中遍历key或者values,一般适用于只需要map中的key或者value时使用,在性能 ...

  9. c .net ajax,Asp.net mvc 2中使用Ajax的三种方式

    在Asp.net MVC中,我们能非常方便的使用Ajax.这篇文章将介绍三种Ajax使用的方式,分别为原始的Ajax调用.Jquery.Ajax Helper.分别采用这三种方式结合asp.net m ...

  10. JavaScript概述和HTML中嵌入JavaScript的三种方式

    "成功没有捷径,脚踏实地一步一个脚印,该来的总会来,不好高骛远,不急功近利,付出总会有回报,不管处于哪个阶段,都要一步一个脚印,踏实的走好每一步!" 目录 01.JavaScrip ...

最新文章

  1. 磁盘的顺序读写与随机读写详解
  2. 华为 命令 so easy
  3. 微软Azure storage account的connection string
  4. 机器学习实战--决策树算法
  5. ios7 导航栏 手势 右划 自动返回 相关
  6. Python中将array类型不按科学计数法存在文件中的方法
  7. PHP array_merge()函数与示例
  8. 面试pythone_Python面试考题
  9. wpf 绘制矩形_WPF制作倒影效果
  10. java中三种方法_Java文件I/O的三种方法
  11. VLC框架总结(二)VLC源码及各modules功能介绍
  12. 【数字图像处理系列一】opencv-python快速入门篇
  13. 基于全网最棒的Vue教学视频(尚硅谷张天禹老师)整理出的最详细的Vue指令笔记
  14. windows 安装apex_《Apex英雄》:如何在你的PC上下载安装玩到它
  15. while循环的使用
  16. 音频合并的步骤有哪些
  17. 苹果怎么付费购买内存_苹果怎么清理隐藏内存?手机恢复如初都靠它了
  18. 应用启动图标未读消息数显示 工具类
  19. 解决“Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)“MySQL登录报错问题
  20. 终于有大佬把“计算机底层原理“全部总结出来了

热门文章

  1. [LeetCode][easy]Rank Transform of an Array
  2. (1)算法设计与分析_算法设计思路
  3. android studio for android learning (二十七) UI控件动态加载机制浅析
  4. 基于python和mysql的查询操作
  5. 【BZOJ 2726】任务安排【斜率优化dp】
  6. 使用PS2EXE将PowerShell脚本编译为可执行程序
  7. Hvv近期0day总结四
  8. 分析一个在高并发下的财务支付锁的问题
  9. php基础--变量及作用域
  10. Unity基础-图形渲染