Cenni preliminari sugli editor di tipi con interfaccia utente
Implementando un editor di tipo dell'interfaccia utente, è possibile fornire una soluzione di progettazione personalizzata per tipi di proprietà complessi.
Visualizzazione e modifica dei tipi personalizzati
Quando si espone un tipo personalizzato come proprietà, sono disponibili tre sistemi per modificare il valore di proprietà in una classe PropertyGrid:
È possibile modificare la proprietà sul posto come stringa utilizzando una classe TypeConverter per il tipo personalizzato. Per ulteriori informazioni, vedere Procedura: implementare un convertitore di tipi.
È possibile modificare la proprietà mediante un'interfaccia utente a discesa. Questo sistema è particolarmente utile per le proprietà che è possibile impostare con un solo clic.
È possibile modificare la proprietà mediante una finestra di dialogo modale. Se la proprietà è particolarmente complessa, per modificarla correttamente può essere necessaria una finestra di dialogo completa.
Per attivare la modifica mediante un solo clic o una finestra di dialogo modale, è necessario implementare un editor di tipi con interfaccia utente per interagire con una classe PropertyGrid.
Editor a discesa
Gli editor a discesa sono la soluzione ideale per i tipi che è possibile impostare con un solo clic. Con un editor a discesa, ad esempio, è possibile modificare le proprietà Dock e BackColor della classe Control in una classe PropertyGrid.
Per accedere a un editor di tipi con interfaccia utente, è possibile fare clic sul pulsante freccia () visualizzato accanto alla voce di proprietà selezionata in una classe PropertyGrid. Viene visualizzata l'interfaccia utente personalizzata associata a PropertyGrid. La parte superiore della finestra è ubicata lungo la parte inferiore della voce di proprietà e le relative larghezze corrispondono. Dopo che l'utente ha effettuato una selezione, è necessario chiudere anche la finestra dell'editor. L'implementazione deve chiamare il metodo DropDownControl per posizionare e ridimensionare la finestra dell'editor di tipi con interfaccia utente nell'ambiente di progettazione e sarà necessario chiamare il metodo CloseDropDown per chiudere la finestra.
Editor delle finestre di dialogo modali
Gli editor modali sono utili per i tipi che richiedono un'interfaccia utente completamente interattiva. Sono editor modali, ad esempio, editor di raccolta quali l'Editor della raccolta TabPage di TabControl o la finestra di dialogo Modifica colonne del controllo DataGridView.
Per accedere a un editor di tipi con interfaccia utente modale, è possibile fare clic sul pulsante con i puntini di sospensione () visualizzato accanto alla voce di proprietà selezionata in una classe PropertyGrid. Viene visualizzata la finestra di dialogo modale con cui l'utente potrà interagire come se fosse una normale finestra di dialogo. L'implementazione deve chiamare il metodo ShowDialog per posizionare e ridimensionare la finestra di dialogo nell'ambiente di progettazione.
Implementazione di un editor di tipi con interfaccia utente
Per implementare un editor di tipi con interfaccia utente personalizzato, è necessario eseguire almeno le attività illustrate di seguito:
Definire una classe che deriva da UITypeEditor.
Eseguire l'override del metodo GetEditStyle per informare la classe PropertyGrid dello stile del tipo di editor che verrà utilizzato dall'editor.
Eseguire l'override del metodo EditValue per la gestione dell'interfaccia utente, l'elaborazione degli input dell'utente e l'assegnazione dei valori.
Per aggiungere ulteriore supporto per la creazione di una rappresentazione di valore in una classe PropertyGrid, è possibile eseguire le attività illustrate di seguito:
Eseguire l'override di GetPaintValueSupported per indicare che l'editor supporta la visualizzazione della rappresentazione del valore.
Eseguire l'override di PaintValue per implementare la visualizzazione della rappresentazione del valore.
Eseguire l'override del metodo del costruttore UITypeEditor se l'editor deve avere un comportamento di inizializzazione.
Nota
Gli editor di tipi con interfaccia utente vengono spesso implementati utilizzando tipi inclusi nello spazio dei nomi System.Windows.Forms, tuttavia l'utilizzo di questi ultimi non è obbligatorio.Gli editor di tipi con interfaccia utente standard in .NET Framework derivano da UITypeEditor.
Derivazione dalla classe UITypeEditor
L'editor di tipi con interfaccia utente personalizzato deve derivare dalla classe UITypeEditor. Se per l'editor di tipi con interfaccia utente è necessaria un'inizializzazione speciale, definire un costruttore predefinito.
Override del metodo GetEditStyle
Quando si seleziona un componente o un controllo nella finestra di progettazione, la finestra Proprietà viene ridisegnata con i valori della proprietà del controllo o del componente selezionato. Quando si seleziona un proprietà, l'ambiente di progettazione esegue una query sul metodo GetEditStyle per determinare come rappresentare la voce di proprietà.
L'override restituisce un valore dall'enumerazione UITypeEditorEditStyle per comunicare lo stile appropriato dell'editor di tipi con interfaccia utente.
Nella tabella riportata di seguito è illustrato il comportamento associato a ciascun valore UITypeEditorEditStyle.
Nome membro |
Comportamento |
---|---|
Non fornisce componenti dell'interfaccia utente interattivi. Una classe TypeConverter appropriata viene utilizzata per convertire una voce di stringa in un valore di proprietà. |
|
Consente di visualizzare un pulsante freccia GIÙ () nella voce di proprietà. L'interfaccia utente viene inserita in una finestra a discesa. |
|
Consente di visualizzare un pulsante con i puntini di sospensione () nella voce di proprietà. L'interfaccia utente è una finestra di dialogo modale. |
Override del metodo EditValue
Il metodo EditValue consente di visualizzare l'interfaccia utente e di impostare la proprietà sul valore selezionato dall'utente.
Editor a discesa
Per un editor di tipi con interfaccia utente a discesa, è necessario richiedere l'interfaccia IWindowsFormsEditorService a un provider di servizi. Il servizio fornisce informazioni sulla posizione e la dimensione dell'interfaccia utente. L'interfaccia utente viene in genere implementata come classe Control. L'implementazione di EditValue crea un'istanza del controllo, la inizializza con il valore di proprietà corrente e la passa quindi al metodo DropDownControl per consentirne l'esecuzione da parte dell'ambiente di progettazione. Quando l'utente seleziona un nuovo valore per la proprietà, l'implementazione di EditValue chiude l'interfaccia utente chiamando il metodo CloseDropDown. Il valore restituito dall'implementazione di EditValue diventa il nuovo valore di proprietà visualizzato in una classe PropertyGrid.
Editor modale
Per un editor di tipi con interfaccia utente modale, è necessario richiedere l'interfaccia IWindowsFormsEditorService a un provider di servizi. Il servizio fornisce informazioni sulla posizione relative alla finestra di dialogo. L'interfaccia utente viene in genere implementata come classe derivata da Form. L'implementazione di EditValue crea un'istanza del form, la inizializza con il valore di proprietà corrente e quindi la passa al metodo ShowDialog per consentirne l'esecuzione da parte dell'ambiente di progettazione. Se il valore restituito dalla chiamata è OK, si recupera il nuovo valore di proprietà dal form e lo si utilizza come valore restituito. Il valore restituito dall'implementazione di EditValue diventa il nuovo valore di proprietà visualizzato in una classe PropertyGrid.
Parametro ITypeDescriptorContext
Il metodo EditValue riceve un parametro ITypeDescriptorContext che è possibile utilizzare per richiedere informazioni contestuali sull'ambiente di progettazione. Questo parametro consente di accedere ai seguenti membri:
Una classe PropertyDescriptor che rappresenta i metadati della proprietà
Una proprietà Instance che fa riferimento al componente selezionato nella classe PropertyGrid.
L'interfaccia IContainer del componente.
I metodi OnComponentChanging e OnComponentChanged che segnalano all'ambiente di progettazione eventuali modifiche dello stato di un componente.
Rappresentazione grafica del valore di proprietà
È possibile visualizzare una rappresentazione grafica del valore della proprietà eseguendo l'override del metodo PaintValue. Utilizzando il parametro PaintValueEventArgs fornito è possibile disegnare la rappresentazione in piccolo rettangolo sul lato sinistro della voce di proprietà in una classe PropertyGrid.
Nota
Accertarsi che la rappresentazione grafica non superi i limiti definiti dalla proprietà Bounds del parametro PaintValueEventArgs.
Eseguire l'override del metodo GetPaintValueSupported per restituire un valore true e segnalare all'ambiente di progettazione che l'editor di tipi con interfaccia utente sta creando una rappresentazione grafica del relativo valore.
Vedere anche
Attività
Procedura: creare un editor di tipo con interfaccia utente
Procedura: creare un controllo Windows Form che utilizza le funzionalità di progettazione