Fork me on GitHub
PropertyGrid仿VS的属性事件窗口

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 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<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);
        }
        #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;
            }
        }
复制代码

想要源码的请加群。

WPF、AE技术交流群:94234450  

群链接:http://wp.qq.com/wpa/qunwpa?idkey=14e3d476b4a53a3a1502183e5a384d94b8be74b7510c0a76e67c4dec61f23781

posted on 2013-08-13 14:53  HackerVirus  阅读(574)  评论(0编辑  收藏  举报