我已经将ControlDesigner
类继承为MyControlDesigner
。
在此类中,我需要获取ITypeDescriptorContext
和IServiceProvider
接口(interface)背后的对象,但我不知道如何:(
我需要这两个接口(interface)在方法中传递它们,但在任何其他对象中都找不到它们。
有人能帮帮我吗。
谢谢
此致
博扬
最佳答案
在EditorServiceContext
程序集中有一个内部类System.Design
,它实现了ITypeDescriptorContext
,IServiceProvider
和IWindowsFormsEditorService
。
您可以找到它并创建该类的实例,或者使用其静态方法来满足您的要求。例如,为了显示属性的编辑器,您可以通过以下方式使用它:
var editorServiceContext = typeof(ControlDesigner).Assembly.GetTypes()
.Where(x => x.Name == "EditorServiceContext").FirstOrDefault();
var editValue = editorServiceContext.GetMethod("EditValue",
System.Reflection.BindingFlags.Static |
System.Reflection.BindingFlags.Public);
editValue.Invoke(null, new object[] { this, this.Component, "The Property Name" });
如果出于任何原因您需要类的源对其进行一些更改,请参见以下代码:
using System;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;
internal class EditorServiceContext :
IWindowsFormsEditorService, ITypeDescriptorContext, IServiceProvider
{
// Fields
private IComponentChangeService _componentChangeSvc;
private ComponentDesigner _designer;
private PropertyDescriptor _targetProperty;
// Methods
internal EditorServiceContext(ComponentDesigner designer)
{
this._designer = designer;
}
internal EditorServiceContext(ComponentDesigner designer, PropertyDescriptor prop)
{
this._designer = designer;
this._targetProperty = prop;
if (prop == null)
{
prop = TypeDescriptor.GetDefaultProperty(designer.Component);
if ((prop != null) && typeof(ICollection).IsAssignableFrom(prop.PropertyType))
{
this._targetProperty = prop;
}
}
}
internal EditorServiceContext(ComponentDesigner designer, PropertyDescriptor prop, string newVerbText) : this(designer, prop)
{
this._designer.Verbs.Add(new DesignerVerb(newVerbText, new EventHandler(this.OnEditItems)));
}
public static object EditValue(ComponentDesigner designer, object objectToChange, string propName)
{
PropertyDescriptor prop = TypeDescriptor.GetProperties(objectToChange)[propName];
EditorServiceContext context = new EditorServiceContext(designer, prop);
object obj2 = prop.GetValue(objectToChange);
object obj3 = (prop.GetEditor(typeof(UITypeEditor)) as UITypeEditor).EditValue(context, context, obj2);
if (obj3 != obj2)
{
try
{
prop.SetValue(objectToChange, obj3);
}
catch (CheckoutException)
{
}
}
return obj3;
}
private void OnEditItems(object sender, EventArgs e)
{
object component = this._targetProperty.GetValue(this._designer.Component);
if (component != null)
{
CollectionEditor editor = TypeDescriptor.GetEditor(component, typeof(UITypeEditor)) as CollectionEditor;
if (editor != null)
{
editor.EditValue(this, this, component);
}
}
}
void ITypeDescriptorContext.OnComponentChanged()
{
this.ChangeService.OnComponentChanged(this._designer.Component, this._targetProperty, null, null);
}
bool ITypeDescriptorContext.OnComponentChanging()
{
try
{
this.ChangeService.OnComponentChanging(this._designer.Component, this._targetProperty);
}
catch (CheckoutException exception1)
{
if (exception1 != CheckoutException.Canceled)
{
throw;
}
return false;
}
return true;
}
object IServiceProvider.GetService(Type serviceType)
{
if ((serviceType == typeof(ITypeDescriptorContext)) || (serviceType == typeof(IWindowsFormsEditorService)))
{
return this;
}
if ((this._designer.Component != null) && (this._designer.Component.Site != null))
{
return this._designer.Component.Site.GetService(serviceType);
}
return null;
}
void IWindowsFormsEditorService.CloseDropDown()
{
}
void IWindowsFormsEditorService.DropDownControl(Control control)
{
}
DialogResult IWindowsFormsEditorService.ShowDialog(Form dialog)
{
IUIService service = (IUIService)((IServiceProvider)this).GetService(typeof(IUIService));
if (service != null)
{
return service.ShowDialog(dialog);
}
return dialog.ShowDialog(this._designer.Component as IWin32Window);
}
// Properties
private IComponentChangeService ChangeService
{
get
{
if (this._componentChangeSvc == null)
{
this._componentChangeSvc = (IComponentChangeService)((IServiceProvider)this).GetService(typeof(IComponentChangeService));
}
return this._componentChangeSvc;
}
}
IContainer ITypeDescriptorContext.Container
{
get
{
if (this._designer.Component.Site != null)
{
return this._designer.Component.Site.Container;
}
return null;
}
}
object ITypeDescriptorContext.Instance
{
get
{
return this._designer.Component;
}
}
PropertyDescriptor ITypeDescriptorContext.PropertyDescriptor
{
get
{
return this._targetProperty;
}
}
}