ITypeDescriptorContext
, IServiceProvider
ve IWindowsFormsEditorService
uygulamıştır System.Design
mecliste bir iç sınıf EditorServiceContext
yoktur.
Sınıfın bir örneğini bulabilir ve gereksiniminizi karşılamak için statik yöntemlerini kullanabilirsiniz. örnek, bir özellik için editör göstermek için, bunu şu şekilde kullanabilirsiniz: Herhangi bir nedenle bunda bazı değişiklikler uygulamak için sınıfın kaynağını gerekiyorsa
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" });
, burada kodudur o sınıfı:
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;
}
}
}
Bu eski bir soru ve muhtemelen artık cevaba ihtiyacım yok ama gelecek okuyucular [cevabım] bulabilir (http://stackoverflow.com/questions/4811446/how-to- elde-itypedescriptorcontext-ve-iserviceprovider-in-app-kontrolde # 43827054) yararlı. –