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