PropertyGrid仿VS的属性事件窗口
效果图:。
首先我们去重写一下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的属性事件窗口相关推荐
- 获取对象的接口信息(方法/属性/事件)(VB6代码)
要不是WS的超级绿豆提起这东西,我还不知道呢.... 真是个好玩意!!能列出一个对象的接口,包括方法,属性,事件.....微软直接做了啊. 记录一下,以后要用到时免得忘了: Option Explic ...
- 可拖拽悬浮球,仿Assistive Touch弹出窗口
可拖拽悬浮球,仿Assistive Touch弹出窗口 悬浮球 layout中使用DragFloatActionButton 最重要的事情!!!一定要给DragFloatActionButton设置点 ...
- vue、Affix 固钉、Affix 属性事件、vue Affix 全部固钉、vue Affix 全部属性事件
vue.Affix 固钉.Affix 属性事件.vue Affix 全部固钉.vue Affix 全部属性事件 设计规则 何时使用 代码演示 1.基本 2.固定状态改变的回调 3.滚动容器 API 事 ...
- vue 所有按钮属性、vue Button 所有按钮属性事件、vue a-button 所有按钮属性事件、vue 按钮所有属性事件、vue
vue 所有按钮属性.vue Button 所有按钮属性事件.vue a-button 所有按钮属性事件.vue 按钮所有属性事件.vue 1.组件注册 1.按钮类型 2.按钮组合 3.不可用状态 4 ...
- vue、Cascader 级联选择、Cascader 属性事件方法、vue Cascader 所有级联选择样式、vue Cascader 级联选择全部属性事件方法
vue.Cascader 级联选择.Cascader 属性事件方法.vue Cascader 所有级联选择样式.vue Cascader 级联选择全部属性事件方法 Cascader 级联选择 何时使用 ...
- vue、Dropdown 下拉菜单、Dropdown属性事件、vue Dropdown 全部下拉菜单、vue Dropdown 全部属性事件
vue.Dropdown 下拉菜单.Dropdown属性事件.vue Dropdown 全部下拉菜单.vue Dropdown 全部属性事件 设计规则 何时使用 代码演示 1.基本 2.右键菜单 3. ...
- vue、Menu 导航菜单、Menu属性事件、vue Menu 全部导航菜单、vue Menu 全部属性事件
vue.Menu 导航菜单.Menu属性事件.vue Menu 全部导航菜单.vue Menu 全部属性事件 设计规则 何时使用 代码演示 顶部导航 内嵌菜单 缩起内嵌菜单 只展开当前父级菜单 垂直菜 ...
- vue、Layout 布局、Layout 属性事件、vue Layout 全部布局、vue Layout 全部属性事件
vue.Layout 布局.Layout 属性事件.vue Layout 全部布局.vue Layout 全部属性事件 设计规则 尺寸 交互 视觉 组件概述 代码演示 1.基本结构 2.自定义触发器 ...
- PropertyGrid 绑定动态的属性与值的集合
建立下面3个类: XProp XPropDescriptor XProps 建立Class XProp XProp 就是用户将具体使用的属性.PropertyGrid 很炫的一点就是属性的定制可以有很 ...
最新文章
- 基于注解的 IOC 配置
- 网络经典命令行【网络高手必备】
- Dapr + .NET 实战(七)Secrets
- track文件 什么是git_Git 从入门到放弃命令大全
- android webviwe 头布局,Android布局问题,带有WebView下方的按钮
- C++学习笔记-继承
- 无心剑随感《程序人生乐无穷》
- ORA-01795: 列表中的最大表达式数为 1000
- 西华师范大学计算机专业保研资格,西华师范大学计算机学院 计算机应用技术保研条件...
- 机器学习实战教程(13篇)
- 字符自编车牌号c语言,自编车牌号码大全 2018年自编车牌号技巧
- 天轰穿·甜老丝儿。科创少年
- opencv+paddle orc 识别图片提取表格信息
- flash player 9 安装错误:您尝试安装的adobeflashplayer版本不是最新版本
- java 读取sqlite_在Java中使用Sqlite数据库
- 华为q1设置虚拟服务器,华为路由Q1的上网设置教程
- 欧姆龙PLC HostLink通讯 C-MODE格式
- 向量的方向余弦公式_定位中方向余弦矩阵(DCM)简介
- 7-4 大炮打蚊子 (20分)__C++
- setsockopt与getsockopt的参数解析与使用
热门文章
- 出现 Request Entity Too Large问题的解决方法
- 解决win10 蓝牙设备只能配对无法连接 ,并且删除设备无效的问题
- 单点登录(SSO)解决方案之 CAS服务端数据源设置及页面改造
- 在JavaScript中解析查询字符串[重复]
- 不支持的major.minor版本52.0 [重复]
- 片段中的findViewById
- ubuntu18.04解锁apt
- html 下拉列表返回值,jquery 根据后台返回值来选中下拉框 option 值
- 聊天机器人mysql数据_自己动手开发智能聊天机器人完全指南(附完整源码)
- 外部类、内部类、局部内部类、匿名类(Java)