效果图:

首先我们去重写一下PropertyGrid:

internal class MyPropertyGrid : System.Windows.Forms.PropertyGrid{private System.ComponentModel.Container components = null;public MyPropertyGrid(){InitializeComponent();}protected override void Dispose(bool disposing){if (disposing){if (components != null){components.Dispose();}}base.Dispose(disposing);}#region Component Designer generated codeprivate void InitializeComponent(){components = new System.ComponentModel.Container();}#endregionpublic void ShowEvents(bool show){ShowEventsButton(show);}}

重写一下Container用来封装组件:

class IDEContainer : Container{class IDESite : ISite{private string name = "";private IComponent component;private IDEContainer container;public IDESite(IComponent sitedComponent, IDEContainer site, string aName){component = sitedComponent;container = site;name = aName;}public IComponent Component{get { return component; }}public IContainer Container{get { return container; }}public bool DesignMode{get { return false; }}public string Name{get { return name; }set { name = value; }}public object GetService(Type serviceType){return container.GetService(serviceType);}}public IDEContainer(IServiceProvider sp){serviceProvider = sp;}protected override object GetService(Type serviceType){object service = base.GetService(serviceType);if (service == null){service = serviceProvider.GetService(serviceType);}return service;}public ISite CreateSite(IComponent component){return CreateSite(component, "UNKNOWN_SITE");}protected override ISite CreateSite(IComponent component, string name){ISite site = base.CreateSite(component, name);if (site == null){}return new IDESite(component, this, name);}private IServiceProvider serviceProvider;}

去实现EventBindingService接口,用来做事件处理:

public class EventBindingService : System.ComponentModel.Design.EventBindingService{public EventBindingService(IServiceProvider myhost): base(myhost){}#region IEventBindingService Membersprotected override string CreateUniqueMethodName(IComponent component, EventDescriptor e){throw new Exception("The method or operation is not implemented.");}protected override System.Collections.ICollection GetCompatibleMethods(System.ComponentModel.EventDescriptor e){List<object> l = new List<object>();return l;}protected override bool ShowCode(System.ComponentModel.IComponent component, System.ComponentModel.EventDescriptor e, string methodName){throw new Exception("The method or operation is not implemented.");}protected override bool ShowCode(int lineNumber){throw new Exception("The method or operation is not implemented.");}protected override bool ShowCode(){throw new Exception("The method or operation is not implemented.");}#endregion}

主窗体页面代码(在这里去绑定控件):
private System.ComponentModel.IContainer components = null;protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}#endregionPropertiesForm propertiesForm;DesignSurface designSurface;public MainForm(){designSurface = new DesignSurface();propertiesForm = new PropertiesForm(designSurface);propertiesForm.Show();IServiceContainer serviceContainer = (IServiceContainer)designSurface.GetService(typeof(IServiceContainer));serviceContainer.AddService(typeof(IEventBindingService), new EventBindingService(designSurface));ISelectionService selectionService = (ISelectionService)designSurface.GetService(typeof(ISelectionService));selectionService.SelectionChanged += new EventHandler(OnSelectionChanged);designSurface.BeginLoad(typeof(Form));}private void OnSelectionChanged(object sender, System.EventArgs e){ISelectionService s = (ISelectionService)designSurface.GetService(typeof(ISelectionService));IDesignerHost designerHost = (IDesignerHost)designSurface.GetService(typeof(IDesignerHost));object[] selection;if (s.SelectionCount == 0)propertiesForm.SetObjectToPropertyGrid(null);else{selection = new object[s.SelectionCount];s.GetSelectedComponents().CopyTo(selection, 0);propertiesForm.SetObjectToPropertyGrid(selection);}}

PropertyGrid页面代码(主要为PropertyGrid绑定数据和添加事件选项卡):

private DesignSurface designSurface;private System.ComponentModel.IContainer components = null;private MyPropertyGrid pg = null;protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}public PropertiesForm(DesignSurface designSurface){this.designSurface = designSurface;this.SuspendLayout();pg = new MyPropertyGrid();pg.Parent = this;pg.Dock = DockStyle.Fill;this.ResumeLayout(false);}internal void SetObjectToPropertyGrid(object[] c){IDesignerHost designerHost = (IDesignerHost)designSurface.GetService(typeof(IDesignerHost));if (c == null)pg.SelectedObject = null;elsepg.SelectedObjects = c;if (designerHost != null){pg.Site = (new IDEContainer(designerHost)).CreateSite(pg);pg.PropertyTabs.AddTabType(typeof(System.Windows.Forms.Design.EventsTab), PropertyTabScope.Document);pg.ShowEvents(true);}else{pg.Site = null;}}

想要源码的请加群。

点击加入QQ群:

WPF、AE技术交流群:94234450

 

转载于:https://www.cnblogs.com/BeiJing-Net-DaiDai/p/3254455.html

PropertyGrid仿VS的属性事件窗口相关推荐

  1. 获取对象的接口信息(方法/属性/事件)(VB6代码)

    要不是WS的超级绿豆提起这东西,我还不知道呢.... 真是个好玩意!!能列出一个对象的接口,包括方法,属性,事件.....微软直接做了啊. 记录一下,以后要用到时免得忘了: Option Explic ...

  2. 可拖拽悬浮球,仿Assistive Touch弹出窗口

    可拖拽悬浮球,仿Assistive Touch弹出窗口 悬浮球 layout中使用DragFloatActionButton 最重要的事情!!!一定要给DragFloatActionButton设置点 ...

  3. vue、Affix 固钉、Affix 属性事件、vue Affix 全部固钉、vue Affix 全部属性事件

    vue.Affix 固钉.Affix 属性事件.vue Affix 全部固钉.vue Affix 全部属性事件 设计规则 何时使用 代码演示 1.基本 2.固定状态改变的回调 3.滚动容器 API 事 ...

  4. vue 所有按钮属性、vue Button 所有按钮属性事件、vue a-button 所有按钮属性事件、vue 按钮所有属性事件、vue

    vue 所有按钮属性.vue Button 所有按钮属性事件.vue a-button 所有按钮属性事件.vue 按钮所有属性事件.vue 1.组件注册 1.按钮类型 2.按钮组合 3.不可用状态 4 ...

  5. vue、Cascader 级联选择、Cascader 属性事件方法、vue Cascader 所有级联选择样式、vue Cascader 级联选择全部属性事件方法

    vue.Cascader 级联选择.Cascader 属性事件方法.vue Cascader 所有级联选择样式.vue Cascader 级联选择全部属性事件方法 Cascader 级联选择 何时使用 ...

  6. vue、Dropdown 下拉菜单、Dropdown属性事件、vue Dropdown 全部下拉菜单、vue Dropdown 全部属性事件

    vue.Dropdown 下拉菜单.Dropdown属性事件.vue Dropdown 全部下拉菜单.vue Dropdown 全部属性事件 设计规则 何时使用 代码演示 1.基本 2.右键菜单 3. ...

  7. vue、Menu 导航菜单、Menu属性事件、vue Menu 全部导航菜单、vue Menu 全部属性事件

    vue.Menu 导航菜单.Menu属性事件.vue Menu 全部导航菜单.vue Menu 全部属性事件 设计规则 何时使用 代码演示 顶部导航 内嵌菜单 缩起内嵌菜单 只展开当前父级菜单 垂直菜 ...

  8. vue、Layout 布局、Layout 属性事件、vue Layout 全部布局、vue Layout 全部属性事件

    vue.Layout 布局.Layout 属性事件.vue Layout 全部布局.vue Layout 全部属性事件 设计规则 尺寸 交互 视觉 组件概述 代码演示 1.基本结构 2.自定义触发器 ...

  9. PropertyGrid 绑定动态的属性与值的集合

    建立下面3个类: XProp XPropDescriptor XProps 建立Class XProp XProp 就是用户将具体使用的属性.PropertyGrid 很炫的一点就是属性的定制可以有很 ...

最新文章

  1. 基于注解的 IOC 配置
  2. 网络经典命令行【网络高手必备】
  3. Dapr + .NET 实战(七)Secrets
  4. track文件 什么是git_Git 从入门到放弃命令大全
  5. android webviwe 头布局,Android布局问题,带有WebView下方的按钮
  6. C++学习笔记-继承
  7. 无心剑随感《程序人生乐无穷》
  8. ORA-01795: 列表中的最大表达式数为 1000
  9. 西华师范大学计算机专业保研资格,西华师范大学计算机学院 计算机应用技术保研条件...
  10. 机器学习实战教程(13篇)
  11. 字符自编车牌号c语言,自编车牌号码大全 2018年自编车牌号技巧
  12. 天轰穿·甜老丝儿。科创少年
  13. opencv+paddle orc 识别图片提取表格信息
  14. flash player 9 安装错误:您尝试安装的adobeflashplayer版本不是最新版本
  15. java 读取sqlite_在Java中使用Sqlite数据库
  16. 华为q1设置虚拟服务器,华为路由Q1的上网设置教程
  17. 欧姆龙PLC HostLink通讯 C-MODE格式
  18. 向量的方向余弦公式_定位中方向余弦矩阵(DCM)简介
  19. 7-4 大炮打蚊子 (20分)__C++
  20. setsockopt与getsockopt的参数解析与使用

热门文章

  1. 出现 Request Entity Too Large问题的解决方法
  2. 解决win10 蓝牙设备只能配对无法连接 ,并且删除设备无效的问题
  3. 单点登录(SSO)解决方案之 CAS服务端数据源设置及页面改造
  4. 在JavaScript中解析查询字符串[重复]
  5. 不支持的major.minor版本52.0 [重复]
  6. 片段中的findViewById
  7. ubuntu18.04解锁apt
  8. html 下拉列表返回值,jquery 根据后台返回值来选中下拉框 option 值
  9. 聊天机器人mysql数据_自己动手开发智能聊天机器人完全指南(附完整源码)
  10. 外部类、内部类、局部内部类、匿名类(Java)