博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PropertyGrid仿VS的属性事件窗口
阅读量:6692 次
发布时间:2019-06-25

本文共 7077 字,大约阅读时间需要 23 分钟。

效果图:

首先我们去重写一下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 code        private void InitializeComponent()        {            components = new System.ComponentModel.Container();        }        #endregion        public 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 Members        protected 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 l = new List();            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);        }        #endregion        PropertiesForm 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;            else                pg.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

你可能感兴趣的文章
线程等待 Join()方法
查看>>
解决“当前扩展缓存策略没有进行注册”的错误
查看>>
laravel博客后台操作步骤
查看>>
佛家经典语录
查看>>
《React Native 精解与实战》书籍连载「Node.js 简介与 React Native 开发环境配置」...
查看>>
Zabbix系统中的历史数据和趋势数据
查看>>
Maven中基于POM.xml的Profile来动态切换配置信息
查看>>
Easyloggingpp的使用
查看>>
java十五个常用类学习及方法举例
查看>>
Jvm(36),class文件结构----访问标志
查看>>
服务高可用:幂等性设计
查看>>
ant 重置(修改)DatePicker MonthPicker Cascader 的值
查看>>
eShopOnContainers 知多少[3]:Identity microservice
查看>>
WPF自定义TextBox及ScrollViewer
查看>>
go基础系列:简介
查看>>
聚合支付系统设计(二)
查看>>
centos7 安装php7
查看>>
使用java的Calendar工具类获取到本月的第一天起始时间和最后一天结束时间。
查看>>
Docker中安装WordPress
查看>>
oracle goldengate的两种用法
查看>>