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 >

    看下效果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>
public class  WpfPropertyGrid : Grid
{
#region  Private fields
private  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://www.cnblogs.com/zhuqil/archive/2010/09/02/Wpf-PropertyGrid-Demo.html,如需转载请自行联系原作者

相关文章
|
C#
WPF 界面实现多语言支持 中英文切换 动态加载资源字典
原文:WPF 界面实现多语言支持 中英文切换 动态加载资源字典 1、使用资源字典,首先新建两个字典文件en-us.xaml、zh-cn.xaml。定义中英文的字符串在这里面【注意:添加xmlns:s="clr-namespace:System;assembly=mscorlib】 zh-cn.
2898 0
|
C# 数据可视化 开发工具
WPF实现选项卡效果(1)——使用AvalonDock
原文:WPF实现选项卡效果(1)——使用AvalonDock 简介   公司最近一个项目,软件采用WPF开发,需要实现类似于VS的选项卡(或者是浏览器的选项卡)效果。
2116 0
|
IDE C# 开发工具
WPF钟表效果实现
中WPF中的RotateTransform实现UI元素的旋转,并模拟钟表的秒针、分针和时针。
1125 0
WPF钟表效果实现
|
IDE 编译器 C#
WPF实现强大的动态公式计算
数据库可以定义表不同列之间的计算公式,进行自动公式计算,但如何实现行上的动态公式计算呢?行由于可以动态扩展,在某些应用场景下将能很好的解决实际问题。本文就探讨一下如何在WPF中实现一种基于行字段的动态公式计算。
990 0
WPF实现强大的动态公式计算
|
网络协议 C# 移动开发
C# WPF上位机实现和下位机TCP通讯
C# WPF上位机实现和下位机TCP通讯下位机使用北京大华程控电源DH1766-1,上位机使用WPF。实现了电压电流实时采集,曲线显示。上午在公司调试成功,手头没有程控电源,使用TCP服务端模拟。昨天写的TCP服务端正好排上用场。
2337 0
|
C#
WPF特效-实现3D足球效果
原文:WPF特效-实现3D足球效果 WPF 实现 3D足球效果,效果图如下:  每个面加载不同贴图。                                                          ...
860 0
|
算法 C# 容器
WPF特效-实现弧形旋转轮播图
原文:WPF特效-实现弧形旋转轮播图        项目遇到,琢磨并实现了循环算法,主要处理循环替换显示问题       (如:12张图组成一个圆弧,但总共有120张图需要呈现,如何在滑动中进行显示块的替换,并毫无卡顿)        处理的自己感觉比较满意,记录一下。
2042 0
|
C#
wpf采用Xps实现文档显示、套打功能
原文:wpf采用Xps实现文档显示、套打功能 近期的一个项目需对数据进行套打,用户要求现场不允许安装office、页面预览显示必须要与文档完全一致,xps文档来对数据进行处理。Wpf的DocumentView 控件可以直接将数据进行显示,xps也是一种开放式的文档,如果我们能够替换里面的标签就最终实现了我们想要的效果。
1733 0
|
C# 开发工具 git
WPF实现选项卡效果(3)——自定义动态添加的AvalonDock选项卡内容
原文:WPF实现选项卡效果(3)——自定义动态添加的AvalonDock选项卡内容 简介   在前面一篇文章里面,我们实现了AvalonDock选项卡的动态添加,但是对于选项卡里面的内容,我们并没有实现任何有用的功能。
1292 0
|
C# 开发工具 git
WPF实现选项卡效果(2)——动态添加AvalonDock选项卡
原文:WPF实现选项卡效果(2)——动态添加AvalonDock选项卡 简介   在前面一篇文章里面,我们使用AvalonDock实现了类似于VS的选项卡(或者浏览器的选项卡)效果。
1698 0