2013年8月29日星期四

PropertyGrid attributes VS imitation event window

 

renderings : .

 

First we went to rewrite 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);
}
}
 
 

rewrite Container used to package components :

 
  
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;
}
 
 

to achieve EventBindingService interface used for event processing :

 
  
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 page code ( mainly PropertyGrid bound data and add the Events tab ):

 
  
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;
}
}
 
 

want the source code , please add base.

 

WPF, AE technical exchange group : 94234450

 

group link : http://wp.qq.com/wpa/ qunwpa? idkey = 14e3d476b4a53a3a1502183e5a384d94b8be74b7510c0a76e67c4dec61f23781

 
 

1 条评论: