zoukankan      html  css  js  c++  java
  • 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;
                }
            }

    想要源码的请加群。

    点击加入QQ群:

    WPF、AE技术交流群:94234450  

     
  • 相关阅读:
    mysql密码重置
    利用python生成定制二维码
    totnado前后端分离跨域设置
    supervisor详解
    redis持久化常识和配置
    redis数据的备份与恢复
    supervisor下更换源文件报错
    EF5框架封装
    IEnumerable和IEnumerator 详解
    心宽,路自宽
  • 原文地址:https://www.cnblogs.com/BeiJing-Net-DaiDai/p/3254455.html
Copyright © 2011-2022 走看看