Classi base della finestra di progettazione
L'interfaccia IDesigner viene implementata in tutte le finestre di progettazione e consente di definire i metodi base dell'interfaccia della finestra di progettazione. In .NET Framework è inoltre fornito un insieme di classi base della finestra di progettazione mediante il quale vengono forniti metodi utili per le finestre di progettazione che supportano tipi specifici di componenti o controlli.
Interfaccia IDesigner
Una classe della finestra di progettazione deve implementare l'interfaccia IDesigner, come illustrato nell'esempio di codice seguente.
Public Interface IDesigner
Sub Dispose()
Sub Initialize(component As IComponent)
' Other methods.
...
ReadOnly Property Component() As IComponent
' Other properties.
...
End Interface
public interface IDesigner {
void Dispose();
void Initialize(IComponent component);
// Other methods.
...
IComponent Component {
get;
}
// Other properties.
...
}
Il metodo Initialize di un oggetto IDesigner viene chiamato dopo che il componente per la finestra di progettazione è stato collocato, inizializzato e la finestra di progettazione è stata creata. È possibile sottoporre il metodo Initialize a override per eseguire azioni che dovrebbero avere luogo in fase di inizializzazione del componente o della finestra di progettazione. Non è possibile sostituire l'inizializzazione del componente eseguita dal costruttore, tuttavia è possibile fornire argomenti o reimpostare le proprietà inizializzate dal componente. La proprietà Component di un'interfaccia IDesigner viene impostata mediante questo metodo di inizializzazione. base.Initialize(component) dovrebbe sempre essere chiamato dal metodo Initialize se si sottopone questo metodo a override. È possibile accedere al componente di un oggetto IDesigner dalla relativa proprietà Component.
La proprietà Component consente di accedere al componente cui la finestra di progettazione è associata. Questa proprietà viene impostata al momento della creazione dell'oggetto finestra di progettazione e in seguito alla chiamata del metodo Initialize. Al componente è associato un sito, che può essere utilizzato dalla finestra di progettazione per ottenere servizi dall'host della finestra di progettazione stessa.
Il metodo DoDefaultAction viene chiamato quando si fa doppio clic su un componente o un controllo.
È possibile sottoporre a override la proprietà Verbs per restituire una classe DesignerVerbCollection contenente gli oggetti necessari per estendere le voci di un menu di scelta rapida per un componente.
Il metodo Dispose viene richiamato quando è necessario distruggere l'oggetto finestra di progettazione. Il metodo viene chiamato ogni volta che un componente viene rimosso dal contenitore di progettazione.
Classe base della finestra di progettazione per componenti
La classe ComponentDesigner implementa le interfacce IDesigner e IDesignerFilter per offrire metodi aggiuntivi utili per alcune finestre progettazione di componenti.
Classe base della finestra di progettazione per controlli Windows Form
La classe base della finestra di progettazione per i controlli Windows Form è ControlDesigner. Tale classe deriva da ComponentDesigner e consente di ottenere metodi aggiuntivi utili per la personalizzazione dell'aspetto e del comportamento di un controllo Windows Form. Per un esempio di implementazione di una finestra di progettazione di Windows Form, vedere Procedura: implementare una finestra di progettazione per un controllo.
La classe DocumentDesigner fornisce una finestra di progettazione base per estendere il comportamento della modalità progettazione e fornire una visualizzazione di tale modalità a livello di elemento radice per una classe Control che supporta i controlli annidati e riceve messaggi di scorrimento. Per ulteriori informazioni, vedere Procedura: creare un controllo Windows Form che utilizza le funzionalità di progettazione.
Nota
È necessario aggiungere un riferimento all'assembly della fase di progettazione, System.Design.dll. Questo assembly non è incluso in .NET Framework 4 Client Profile. Per aggiungere un riferimento a System.Design.dll, è necessario modificare il framework di destinazione del progetto in .NET Framework 4.
Classe base della finestra di progettazione per i controlli server ASP.NET
La classe base della finestra di progettazione per i controlli server ASP.NET è ControlDesigner. Mediante questa classe viene fornita la funzionalità di base per il rendering personalizzato dei dati HTML in fase di progettazione.
Classi base per l'integrazione in fase di progettazione
TypeConverter fornisce una classe base per la conversione di un tipo in e da una rappresentazione testo. Per ulteriori informazioni sui convertitori di tipi, vedere Procedura: implementare un convertitore di tipi o Conversione di tipi generalizzata.
UITypeEditor fornisce una classe base che è possibile derivare da ed estendere per implementare un editor di tipo personalizzato per l'ambiente di progettazione. Per ulteriori informazioni sull'implementazione di una classe UITypeEditor, vedere Cenni preliminari sugli editor di tipi con interfaccia utente.
Classi base per l'aspetto e il comportamento della finestra di progettazione
È possibile estendere la classe Behavior per sviluppare qualsiasi tipo di comportamento dell'interfaccia utente, inclusi selezione, trascinamento e ridimensionamento. Disegno e hit testing vengono eseguiti dalla classe Glyph.
Per ulteriori informazioni, vedere Cenni preliminari su BehaviorService.
Nota
È necessario aggiungere un riferimento all'assembly della fase di progettazione, System.Design.dll. Questo assembly non è incluso in .NET Framework 4 Client Profile. Per aggiungere un riferimento a System.Design.dll, è necessario modificare il framework di destinazione del progetto in .NET Framework 4.
Classi base per i caricatori della finestra di progettazione
La classe BasicDesignerLoader fornisce un'implementazione dell'interfaccia IDesignerLoaderService. BasicDesignerLoader è l'implementazione completa di un caricatore della finestra di progettazione senza elementi correlati a un formato di persistenza.
CodeDomDesignerLoader è una classe astratta che fornisce un caricatore della finestra di progettazione completo sul modello a oggetti CodeDOM (Code Document Object Model).
Classi base per la serializzazione della finestra di progettazione
CodeDomSerializerBase fornisce una classe base per le classi CodeDomSerializer. CodeDomSerializerBase viene usata come base condivisa tra le classi CodeDomSerializer e TypeCodeDomSerializer.
La classe DesignerSerializationManager fornisce un'implementazione dell'interfaccia IDesignerSerializationManager.
Per ulteriori informazioni, vedere Cenni preliminari sulla serializzazione della finestra di progettazione.
Classe base per smart tag
DesignerActionList fornisce la classe base per i tipi che definiscono un elenco di elementi utilizzati per la creazione di un pannello smart tag. Per ulteriori informazioni, vedere Procedura: collegare smart tag a un componente Windows Form.
Nota
È necessario aggiungere un riferimento all'assembly della fase di progettazione, System.Design.dll. Questo assembly non è incluso in .NET Framework 4 Client Profile. Per aggiungere un riferimento a System.Design.dll, è necessario modificare il framework di destinazione del progetto in .NET Framework 4.
Classe base per il layout personalizzato
La classe LayoutEngine fornisce la classe base per l'implementazione dei moduli di layout. I controlli TableLayoutPanel e FlowLayoutPanel utilizzano la classe LayoutEngine per fornire il comportamento di layout. Per ulteriori informazioni, vedere Procedura: implementare un motore di layout personalizzato.
Finestre di progettazione standard
In Windows Software Development Kit (SDK) è disponibile un insieme di finestre di progettazione per il supporto di tipi specifici di componenti. Queste finestre di progettazione vengono denominate in base ai componenti per i quali vengono utilizzate, con la dicitura Designer come suffisso. La finestra di progettazione relativa alla classe System.Windows.Forms.Control, ad esempio, è System.Windows.Forms.Design.ControlDesigner.
Funzionalità comuni delle finestre di progettazione
Accesso ai servizi per la fase di progettazione da una finestra di progettazione
Gran parte dei servizi per la fase di progettazione possono essere richiesti tramite un metodo GetService passando il tipo di servizio da richiedere. È disponibile un metodo GetService su Component e ComponentDesigner. È inoltre presente un metodo GetService su IServiceProvider, che viene implementato dall'oggetto ISite restituito dalla proprietà Site di un'interfaccia IComponent in modalità progettazione.
Nel codice riportato di seguito viene mostrato come ottenere un'interfaccia di servizio IDesignerHost e un oggetto IMenuCommandService utilizzando un metodo GetService.
Per ulteriori informazioni, vedere Procedura: accedere ai servizi per la fase di progettazione.
Nel codice seguente viene illustrato come ottenere un servizio da un'interfaccia di provider di servizi in modalità progettazione.
' Obtain an IDesignerHost service from the design-time environment.
Dim host As IDesignerHost = CType(Me.Component.Site.GetService(GetType(IDesignerHost)), IDesignerHost)
' Obtain an IMenuCommandService service.
Dim mcs As IMenuCommandService = CType(Me.Component.Site.GetService(GetType(IMenuCommandService)), IMenuCommandService)
// Obtain an IDesignerHost service from the design-time environment.
IDesignerHost host = (IDesignerHost)this.Component.Site.GetService(typeof(IDesignerHost));
// Obtain an IMenuCommandService service.
IMenuCommandService mcs =
(IMenuCommandService)this.Component.Site.GetService(typeof(IMenuCommandService));
Accesso ai componenti di progetto da una finestra di progettazione
Una finestra di progettazione è in grado di ottenere l'accesso ai componenti presenti all'interno di un documento in modalità progettazione mediante l'accesso all'insieme Components della proprietà Container di un'interfaccia di servizio IDesignerHost. Nell'esempio di codice seguente viene illustrato il metodo di accesso ai componenti nel progetto corrente in modalità progettazione.
' Obtains an IDesignerHost service from the design-time environment.
Dim host As IDesignerHost = CType(Me.Component.Site.GetService(GetType(IDesignerHost)), IDesignerHost)
' Gets the components container for the current design-time project.
Dim container As IContainer = host.Container
' The host.Container IContainer contains each IComponent in the project.
// Obtains an IDesignerHost service from the design-time environment.
IDesignerHost host = (IDesignerHost)this.Component.Site.GetService(typeof(IDesignerHost));
// Gets the components container for the current design-time project.
IContainer container = host.Container;
// The host.Container IContainer contains each IComponent in the project.
Una volta ottenuto l'accesso all'insieme di componenti, sarà possibile utilizzare metodi TypeDescriptor e oggetti PropertyDescriptor per identificare i tipi e impostare i valori delle proprietà dei componenti. È inoltre possibile creare componenti che utilizzano il metodo CreateComponent dell'interfaccia IDesignerHost.
Estensione di una finestra di progettazione
Quando si opera una derivazione da un componente con finestra di progettazione associata, per impostazione predefinita la finestra di progettazione della classe base viene associata al componente derivato. È possibile associare al componente una finestra di progettazione diversa applicando un attributo DesignerAttribute che specifichi il tipo di finestra di progettazione da associare al componente. Spesso ai componenti derivati viene associata una finestra di progettazione che estende la finestra di progettazione di base.
Per ulteriori informazioni, vedere Procedura: implementare una finestra di progettazione per un controllo.
Per estendere una finestra di progettazione
Definire una classe derivata dalla classe base della finestra di progettazione.
Associare la classe della nuova finestra di progettazione al componente applicando una classe DesignerAttribute.
Nell'esempio di codice riportato di seguito viene definita una finestra di progettazione che estende un oggetto System.Web.UI.Design.WebControls.LabelDesigner e lo associa a un'etichetta personalizzata che estende la classe System.Web.UI.WebControls.Label.
Namespace MyControls.Design
Public Class MyLabelDesigner
Inherits System.Web.UI.Design.WebControls.LabelDesigner
End Class
End Namespace
Namespace MyControls
<Designer(GetType(MyControls.Design.MyLabelDesigner))> _
Public Class MyLabel
Inherits System.Web.UI.WebControls.Label
End Class
End Namespace
namespace MyControls.Design {
public class MyLabelDesigner : System.Web.UI.Design.WebControls.LabelDesigner {}
}
namespace MyControls {
[Designer(typeof(MyControls.Design.MyLabelDesigner))]
public class MyLabel : System.Web.UI.WebControls.Label {}
}
Nota
Se si definisce una finestra di progettazione per una classe sealed o se non si desidera che altre classi utilizzino la finestra di progettazione o ereditino da essa, sarà possibile rendere la classe della finestra di progettazione interna all'assembly. L'host di progettazione sarà comunque in grado di creare un'istanza della finestra di progettazione, ma non contribuirà al modello a oggetti pubblico.
Vedere anche
Attività
Procedura: accedere ai servizi per la fase di progettazione
Procedura: accedere al supporto in fase di progettazione in Windows Form
Concetti
Applicazione di filtri ai metadati
Procedura: implementare una finestra di progettazione per un controllo