Applicazione di filtri ai metadati
L'applicazione di filtri di metadati consente a una finestra di progettazione di modificare un insieme di proprietà, attributi ed eventi esposti da un componente o controllo in fase di progettazione.
Control, ad esempio, è dotato di una proprietà chiamata Visible che determina se il controllo è visibile o meno. In fase di progettazione, tuttavia, è opportuno che il controllo rimanga sempre visibile, indipendentemente dal valore di questa proprietà, in modo che gli sviluppatori possano posizionarlo sull'area di progettazione. La finestra di progettazione di Control sostituisce la proprietà Visible con la propria versione per la fase di progettazione e solo in seguito ripristina per la proprietà il valore della fase di esecuzione.
Per consentire l'applicazione di filtri ai metadati, una finestra di progettazione può implementare l'interfaccia IDesignerFilter oppure aggiungere un'implementazione ITypeDescriptorFilterService al provider di servizi per la fase di progettazione che può quindi eseguire l'applicazione del filtro ai metadati su qualsiasi componente nell'ambiente di progettazione.
Quando un componente viene selezionato in fase di progettazione, il visualizzatore proprietà effettuerà una query sul componente per ottenerne gli attributi, gli eventi e le proprietà mediante i metodi di un oggetto TypeDescriptor. Quando viene effettuata una query su un componente per ottenerne attributi, eventi e proprietà in modalità progettazione, qualsiasi finestra di progettazione per il componente che implementi l'interfaccia IDesignerFilter sarà in grado di modificare l'insieme di attributi, proprietà ed eventi restituiti dal componente. I metodi di qualsiasi oggetto ITypeDescriptorFilterService attivo vengono quindi chiamati per consentire al servizio di eseguire l'eventuale applicazione di filtri ad attributi, eventi e proprietà.
Un componente in modalità progettazione normalmente riceve query su attributi, eventi e proprietà quando il metodo Refresh dell'oggetto TypeDescriptor viene chiamato per il componente, quando la finestra Proprietà viene aggiornata, quando la modalità progettazione viene stabilita o ristabilita e quando viene impostata la selezione principale. I metodi di altri oggetti o un ambiente di progettazione potrebbero chiamare metodi da un oggetto TypeDescriptor in altri momenti.
Interfaccia IDesignerFilter per l'applicazione di filtri ai metadati dei componenti
L'interfaccia IDesignerFilter consente di definire un insieme di metodi di cui è possibile eseguire l'override e che è possibile implementare in una finestra di progettazione per modificare le proprietà, gli eventi o gli attributi esposti dal componente gestito dalla finestra di progettazione e in fase di progettazione.
Ciascun metodo dell'interfaccia IDesignerFilter interface è provvisto di prefisso "Pre" o "Post". Ciascun metodo è provvisto di suffisso "Attributes", "Events" o "Properties", a seconda del tipo di membro che consente di aggiungere, modificare o rimuovere. Per aggiungere attributi, eventi o proprietà, utilizzare il metodo desiderato tra quelli il cui nome inizia per "Pre". Per modificare o rimuovere attributi, eventi o proprietà, utilizzare il metodo desiderato tra quelli il cui nome inizia per "Post". I metodi i cui nomi iniziano per "Pre" vengono chiamati immediatamente prima di quelli i cui nomi iniziano per "Post".
Se si desidera aggiungere uno o più attributi, implementare un override del metodo PreFilterAttributes che aggiunge il nuovo attributo System.Attribute all'oggetto IDictionary passato al metodo. Le chiavi nel dizionario sono gli ID del tipo degli attributi. Per modificare o rimuovere uno o più attributi, implementare un override del metodo PostFilterAttributes.
Se si desidera aggiungere uno o più eventi, implementare un override del metodo PreFilterEvents che aggiunge il nuovo descrittore EventDescriptor all'oggetto IDictionary passato al metodo. Le chiavi nel dizionario sono i nomi degli eventi. Per modificare o rimuovere uno o più eventi, implementare un override del metodo PostFilterEvents.
Se si desidera aggiungere una o più proprietà, implementare un override del metodo PreFilterProperties che aggiunge il nuovo descrittore PropertyDescriptor all'oggetto IDictionary passato al metodo. Le chiavi nel dizionario sono i nomi delle proprietà. Per modificare o rimuovere una o più proprietà, implementare un override del metodo PostFilterProperties.
Nota
Quando una classe estende una finestra di progettazione che implementa IDesignerFilter, è necessario che ciascun metodo PostNomeMetodo chiami il corrispondente metodo PostNomeMetodo della classe base dopo la modifica dei propri attributi e che ciascun metodo PreNomeMetodo chiami il corrispondente metodo PreNomeMetodo della classe base prima della modifica dei propri attributi.
Nell'esempio di codice seguente vengono mostrate le firme del metodo dell'interfaccia IDesignerFilter.
Public Interface IDesignerFilter
Sub PostFilterAttributes(attributes As IDictionary)
Sub PostFilterEvents(events As IDictionary)
Sub PostFilterProperties(properties As IDictionary)
Sub PreFilterAttributes(attributes As IDictionary)
Sub PreFilterEvents(events As IDictionary)
Sub PreFilterProperties(properties As IDictionary)
End Interface
public interface IDesignerFilter {
void PostFilterAttributes(IDictionary attributes);
void PostFilterEvents(IDictionary events);
void PostFilterProperties(IDictionary properties);
void PreFilterAttributes(IDictionary attributes);
void PreFilterEvents(IDictionary events);
void PreFilterProperties(IDictionary properties);
}
Nell'esempio di codice seguente viene mostrata un'implementazione dell'oggetto IDesignerFilter che aggiunge una proprietà Color
alla finestra di progettazione del componente associato.
Imports System
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Windows.Forms.Design
Namespace IDesignerFilterSample
_
Public Class DesignerFilterDesigner
Inherits ComponentDesigner
' Designer color property to add to component.
Public Property TestColor() As Color
Get
Return Me.intcolor
End Get
Set(ByVal Value As Color)
Me.intcolor = Value
End Set
End Property
' Color for TestColor property.
Private intcolor As Color = Color.Azure
Public Function DesignerFilterDesigner()
End Function 'DesignerFilterDesigner
' Adds a color property of this designer to the component.
Protected Overrides Sub PreFilterProperties(ByVal properties As System.Collections.IDictionary)
MyBase.PreFilterProperties(properties)
' Adds a test property to the component.
properties.Add("TestColor", TypeDescriptor.CreateProperty(GetType(DesignerFilterDesigner), "TestColor", GetType(System.Drawing.Color), Nothing))
End Sub 'PreFilterProperties
End Class 'DesignerFilterDesigner
' Component with which the DesignerFilterDesigner is associated.
<Designer(GetType(DesignerFilterDesigner))> _
Public Class TestComponent
Inherits Component
Public Function TestComponent()
End Function 'TestComponent
End Class 'TestComponent
End Namespace
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;
namespace IDesignerFilterSample
{
public class DesignerFilterDesigner : ComponentDesigner, IDesignerFilter
{
// Designer color property to add to component.
public Color TestColor
{
get
{ return this.intcolor; }
set
{ this.intcolor = value; }
}
// Color for TestColor property.
private Color intcolor = Color.Azure;
public DesignerFilterDesigner()
{}
// Adds a color property of this designer to the component.
protected override void PreFilterProperties(System.Collections.IDictionary properties)
{
base.PreFilterProperties(properties);
// Adds a test property to the component.
properties.Add("TestColor", TypeDescriptor.CreateProperty(typeof(DesignerFilterDesigner), "TestColor", typeof(System.Drawing.Color), null));
}
}
// Component with which the DesignerFilterDesigner is associated.
[Designer(typeof(DesignerFilterDesigner))]
public class TestComponent : Component
{
public TestComponent()
{}
}
}
Per un esempio di finestra di progettazione di controlli Windows Form che implementa il filtro delle proprietà utilizzando l'oggetto IDesignerFilter, vedere Esempio di finestra di progettazione Windows Form.
Servizio ITypeDescriptorFilterService per l'applicazione di filtri ai metadati in modalità progettazione globale
È possibile fornire l'applicazione di filtri ai metadati per qualsiasi componente in un progetto in fase di progettazione, aggiungendo un'implementazione ITypeDescriptorFilterService al provider che fornisce servizi per la fase di progettazione utilizzando il metodo AddService dell'interfaccia IServiceContainer implementata dall'oggetto ISite restituito dalla proprietà Site di un oggetto Component collocato in fase di progettazione.
Nell'esempio seguente viene mostrato come aggiungere un servizio ITypeDescriptorFilterService denominato ExampleFilterService
.
IDesignerHost dh = (IDesignerHost)this.Component.GetService(typeof(IDesignerHost));
if( dh != null )
{
// First gets any previous ITypeDescriptorFilterService to replace when
// the current service is removed, and to call if the new service
// implements service chaining.
ITypeDescriptorFilterService itdfs =
(ITypeDescriptorFilterService)dh.GetService( typeof(ITypeDescriptorFilterService));
oldService = (ITypeDescriptorFilterService)dh.GetService(
typeof(ITypeDescriptorFilterService));
if(oldService != null)
// Removes any old ITypeDescriptorFilterService.
dh.RemoveService(typeof(ITypeDescriptorFilterService));
// Adds an ExampleFilterService that implements service chaining.
dh.AddService(typeof(ITypeDescriptorFilterService),
new ExampleFilterService(oldService));
}
Per un esempio di implementazione del servizio ITypeDescriptorFilterService, vedere la documentazione di riferimento per la classe ITypeDescriptorFilterService.
Vedere anche
Attività
Procedura: modificare attributi, eventi e proprietà di un componente in modalità progettazione
Concetti
Classi base della finestra di progettazione
Verbi di progettazione
Procedura: implementare una finestra di progettazione per un controllo
Cenni preliminari sul descrittore del tipo