2011-01-26 26 views
5

içinde ITypeDescriptorContext ve IServiceProvider nasıl edinilir içine ControlDesigner sınıfını miras aldım.Devralınan ControlDesigner sınıfı

Ben ITypeDescriptorContext ve IServiceProvider arayüzleri arkasındaki nesneleri almanız gerekir Bu sınıfta

ama :(

Ben yönteminde onları geçmek için bu 2 arabirimleri ihtiyaç nasıl bilmiyorum, ama içerden onları bulamıyorum başka nesne.

biri bana yardım edebilir.

teşekkür ederiz

Saygılarımızla Bojan

.210
+0

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ı. –

cevap

1

Component.Site i yapabileceğiniz IServiceProvider almak için ... de bunun için

arıyorum, IServiceProvider uygulayan ITypeDescriptorContext hakkında IDK: var sp = (IServiceProvider) Component.Site;

+0

Cevabınız için teşekkürler, işe yarıyor. ITypeDescriptorContext için arama yapmaya devam edeceğim. Bulursam, burada yazacağım. Tekrar teşekkürler. – Bojan

+0

Yardım için sevindim :) – VoidMain

+0

Eski bir soru ve muhtemelen artık cevaba ihtiyacınız yok, ancak gelecekteki okuyucular [cevabımı] bulabilirler (http://stackoverflow.com/questions/4811446/how-to- elde-itypedescriptorcontext-ve-iserviceprovider-in-app-kontrolde # 43827054) yararlı. –

2

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

[Bu örnekte] için sını test ettim (http://stackoverflow.com/a/43826903/3110834). Ayrıca, [bu bir] için daha hafif bir sürümü (http://stackoverflow.com/a/36794920/3110834) ve [bu] (http://stackoverflow.com/a/36314635/3110834) uyguladım. –

İlgili konular