WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式
原文:WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式

由于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>

第二种方式:自定义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>

第三种方式:使用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>public class WpfPropertyGrid : Grid{#region Private fieldsprivate WorkflowDesigner Designer;private MethodInfo RefreshMethod;private MethodInfo OnSelectionChangedMethod;private TextBlock SelectionTypeLabel;private object TheSelectedObject = null;#endregion#region Public properties/// <summary>/// Get or sets the selected object. Can be null./// </summary>public object SelectedObject{get{return this.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, new object[] { selection });this.SelectionTypeLabel.Text = value.GetType().Name;}else{OnSelectionChangedMethod.Invoke(Designer.PropertyInspectorView, new object[] { null });this.SelectionTypeLabel.Text = string.Empty;}}}/// <summary>/// XAML information with PropertyGrid's font and color information/// </summary>/// <seealso>Documentation for WorkflowDesigner.PropertyInspectorFontAndColorData</seealso>public string 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, new object[0]) as TextBlock;this.SelectionTypeLabel.Text = string.Empty;}/// <summary>/// Updates the PropertyGrid's properties/// </summary>public void RefreshPropertyList(){RefreshMethod.Invoke(Designer.PropertyInspectorView, new object[] { false });}}
}

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

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

作者:朱祁林
 出处:http://zhuqil.cnblogs.com
 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

posted on 2018-08-28 14:10 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/9547911.html

WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式相关推荐

  1. python中两个集合的运算并交补_三种方式实现 Python 中的集合的交、并、补运算...

    文章目录 三种方式实现 Python 中的集合的交.并.补运算 一 背景 集合这个概念在我们高中阶段就有所了解,毕业已多年,我们一起回顾一下几个集合相关的基本概念吧? 集合是指具有某种特定性质的具体的 ...

  2. 【小家Spring】SpringBoot中使用Servlet、Filter、Listener三大组件的三种方式以及原理剖析

    每篇一句 要么就安逸的穷,要么就拼命的干 前提概要 web开发使用Controller基本能解决大部分的需求,但是有时候我们也需要使用Servlet,因为相对于拦截和监听来说,有时候原生的还是比较好用 ...

  3. python函数调用的三种方式_判断python对象是否可调用的三种方式及其区别

    基本上判断python对象是否为可调用的函数,有三种方法: 1.使用内置的callable函数 callable(func) 用于检查对象是否可调用,返回True也可能调用失败,但是返回False一定 ...

  4. 在 Linux 中查找用户帐户和登录详细信息的 11 种方法

    本文将介绍 11 种在 Linux 系统查找用户相关信息的有用方法.这里,我们会讲解在系统中获取一个用户账户详细信息.展示登录详细信息以及用户行为数据的命令. 首先,我们会来看看如何使用命令查找一个用 ...

  5. kubectl命令管理kubernetes对象的三种方式

    kubenetes的抽象概念,如Pod.Service.Volume.Namespace.ReplicaSet.Deployment.StatefulSet.DaemonSet.Job等统称对象,ku ...

  6. Action 中获取表单数据的三种方式

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/53138905  冷血之心的博客) Action 中获取表单提交数据 ...

  7. (1)定义圆Circle类,包含radius半径属性,求面积方法,求周长方法,返返回圆对象的详细信息的方法(2)在测试类中创建长度为5的Circle[]数组,用来装5个圆对象

    import java.util.Random;class Circle{double radius;double area;double perimeter;// 面积public void ger ...

  8. ES6 中三种方式定义对象属性

    ES6 中三种方式定义对象属性 重复样本代码让开发者很不爽,代码混乱掩盖了重要业务代码.ES6关注并解决一些重复的代码方式,使代码简洁.逻辑清晰,如数组解构.对象解构.箭头函数等.本文我们主要介绍利用 ...

  9. Spring中把一个bean对象交给Spring容器管理的三种方式

    一.使用@Component,把bean对象依赖交给Spring容器 注意,该注解不能使用,则说明未添加依赖,需要去该项目pom.xml文件内引入依赖,若该项目只是作为一个存放工具类的子模块项目,没有 ...

最新文章

  1. ubuntu10.04 的服务管理变动
  2. 在asp.net2.0下配置FCKeditor
  3. OS中atomic的实现解析
  4. 基于Linux的SOCKET编程之TCP半双工Client-Server聊天程序
  5. vSphere虚拟化使用第三方备份方案常见CBT故障实战处理
  6. 基于SSM流浪宠物管理系统
  7. 部分AMD RAID驱动程序需及时升级
  8. Web前端:什么是前端框架?
  9. 日常pytho3练习脚本之--两个逗比聊天机器人
  10. 资料共享库 | ApacheCN(apache中文网)
  11. 自动分析黑名单及白名单的iptables脚本
  12. 【详解】Executors框架之Executors
  13. Word 如何从任意页开始显示页码
  14. 获取网络时间(国家标准时间-北京时间为准)
  15. 瑞云服务云|天正电气服务云系统项目顺利验收
  16. 读写c语言编程,c语言文件读写示例(c语言文件操作)
  17. mysql安装 真难啊!
  18. 个人网站开发之前端首次造轮子_篇一【前端大作业】【gowork.fit】
  19. Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
  20. 【通知】HCIE-Datacom 凌云百强榜公布

热门文章

  1. vi 相关快捷键操作
  2. python+vue+elementui校园运动场地体育器材管理系统
  3. 第十章 Golang面向对象编程(上)
  4. 电脑同时安装了WPS和Office,怎么设置文件的默认打开方式?
  5. RSA加密算法的实现
  6. Android/Linux 磁盘写入缓存/等待时间 参数修改
  7. 极端天气数据集(雾天道路数据)
  8. 老机器 系统教程篇:Win2003系统中注册表被禁用不能使用问题解决方法
  9. python分析微信好友签名分析
  10. 亚马逊广告运营常见问答