Colori e stili per Visual Studio

Usare il colore in Visual Studio

In Visual Studio il colore viene usato principalmente come strumento di comunicazione, non solo come decorazione. Usare il colore in modo minimo e riservarlo per le situazioni in cui si vuole:

  • Comunicare significato o affiliazione (ad esempio, modificatori di piattaforma o lingua)

  • Attirare l'attenzione (ad esempio, che indica una modifica dello stato)

  • Migliorare la leggibilità e fornire punti di riferimento per l'esplorazione dell'interfaccia utente

  • Aumentare la desibilità

Esistono diverse opzioni per l'assegnazione di colori agli elementi dell'interfaccia utente in Visual Studio. A volte può essere difficile capire quale opzione si dovrebbe usare o come usarla correttamente. Questo argomento consente di:

  • Informazioni sui diversi servizi e sistemi usati per definire i colori in Visual Studio.

  • Selezionare l'opzione corretta per un determinato elemento.

  • Usare correttamente l'opzione scelta.

Nota

Non impostare mai i colori esadecimali, RGB o di sistema per gli elementi dell'interfaccia utente. L'uso dei servizi consente flessibilità nell'ottimizzazione delle tonalità. Inoltre, senza il servizio, non sarà possibile sfruttare le funzionalità di cambio del tema del servizio VSColor.

Metodi per l'assegnazione del colore agli elementi dell'interfaccia di Visual Studio

Scegliere il metodo più adatto agli elementi dell'interfaccia utente.

Interfaccia utente metodo Quali sono?
Sono state incorporate o autonome finestre di dialogo. Colori di sistema Nomi di sistema che consentono al sistema operativo di definire il colore e l'aspetto degli elementi dell'interfaccia utente, ad esempio controlli comuni della finestra di dialogo.
Si ha un'interfaccia utente personalizzata che si vuole essere coerenti con l'ambiente VS complessivo e si hanno elementi dell'interfaccia utente che corrispondono alla categoria e al significato semantico dei token condivisi. Colori condivisi comuni Nomi di token di colore predefiniti esistenti per elementi dell'interfaccia utente specifici
Si dispone di una singola funzionalità o di un gruppo di funzionalità e non esiste alcun colore condiviso per elementi simili. Colori personalizzati Nomi di token di colore specifici di un'area e che non devono essere condivisi con altre interfacce utente
Si vuole consentire all'utente finale di personalizzare l'interfaccia utente o il contenuto, ad esempio per editor di testo o finestre di progettazione specializzate. Personalizzazione dell'utente finale

(Strumenti) > Finestra di dialogo Opzioni)
Impostazioni definito nella pagina "Tipi di carattere e colori" del Finestra di dialogo Opzioni strumenti > o una pagina specializzata specifica di una funzionalità dell'interfaccia utente.

Temi di Visual Studio

Visual Studio offre tre diversi temi di colore: chiaro, scuro e blu. Rileva anche la modalità contrasto elevato, ovvero un tema a colori a livello di sistema progettato per l'accessibilità.

Agli utenti viene richiesto di selezionare un tema durante il primo uso di Visual Studio e di cambiare tema in un secondo momento passando a Strumenti > Opzioni > Ambiente > generale e scegliendo un nuovo tema dal menu a discesa "tema colore".

Gli utenti possono anche usare Pannello di controllo per cambiare l'intero sistema in uno dei diversi temi a contrasto elevato. Se un utente seleziona un tema a contrasto elevato, il selettore del tema colori di Visual Studio non influisce più sui colori in Visual Studio, anche se eventuali modifiche al tema vengono salvate quando l'utente esce dalla modalità contrasto elevato. Per altre informazioni sulla modalità contrasto elevato, vedere Scelta dei colori a contrasto elevato.

Servizio VSColor

Visual Studio offre un servizio colori dell'ambiente, noto come servizio VSColor, che consente di associare i valori di colore degli elementi dell'interfaccia utente a una voce denominata contenente valori di colore per ogni tema di Visual Studio. In questo modo, i colori verranno modificati automaticamente in modo da riflettere il tema corrente selezionato dall'utente o la modalità contrasto elevato del sistema. L'uso del servizio significa che l'implementazione di tutte le modifiche dei colori correlate al tema viene gestita in un'unica posizione e, se si usano colori condivisi comuni dal servizio, l'interfaccia utente rifletterà automaticamente i nuovi temi nelle versioni future di Visual Studio.

Implementazione

Il codice sorgente di Visual Studio include diversi file di definizione del pacchetto che contengono elenchi di nomi di token e i rispettivi valori di colore per ogni tema. Il servizio colori legge i vscolor definiti in questi file di definizione del pacchetto. Questi colori vengono a cui viene fatto riferimento nel markup XAML o nel codice e quindi caricati tramite il IVsUIShell5.GetThemedColor metodo o un mapping DynamicResource.

Colori di sistema

I controlli comuni fanno riferimento ai colori di sistema per impostazione predefinita. Se si vuole che l'interfaccia utente usi colori di sistema, ad esempio quando si crea una finestra di dialogo incorporata o autonoma, non è necessario eseguire alcuna operazione.

Colori condivisi comuni nel servizio VSColor

Gli elementi dell'interfaccia devono riflettere l'ambiente complessivo di Visual Studio. Riutilizzando i colori condivisi comuni appropriati per il componente dell'interfaccia utente che stai progettando, assicurati che l'interfaccia sia coerente con altre interfacce di Visual Studio e che i colori vengano aggiornati automaticamente quando i temi vengono aggiunti o aggiornati.

Prima di usare colori condivisi comuni, assicurarsi di comprendere come usarli correttamente. L'uso non corretto dei colori condivisi comuni può comportare un'esperienza incoerente, frustrante o confusa per gli utenti.

Colori personalizzabili dall'utente

Vedere: Esposizione dei colori per gli utenti finali

In alcuni casi, è necessario consentire all'utente finale di personalizzare l'interfaccia utente, ad esempio quando si crea un editor di codice o un'area di progettazione. I componenti personalizzabili dell'interfaccia utente sono disponibili nella sezione Tipi di carattere e colori della finestra di dialogo Opzioni strumenti>, in cui gli utenti possono scegliere di modificare il colore di primo piano, il colore di sfondo o entrambi.

Tools > Options dialog
Finestra di dialogo Opzioni strumenti >

Servizio VSColor

Visual Studio fornisce un servizio colori dell'ambiente, denominato anche servizio VSColor o il servizio colori della shell. Questo servizio consente di associare i valori di colore degli elementi dell'interfaccia utente a un set di colori nome-valore contenente i colori per ogni tema. Il servizio VSColor deve essere usato per tutti gli elementi dell'interfaccia utente, in modo che i colori vengano modificati automaticamente in modo da riflettere il tema selezionato dall'utente corrente e in modo che l'interfaccia utente associata al servizio colori dell'ambiente si integri con i nuovi temi nelle versioni future di Visual Studio.

Funzionamento del servizio

Il servizio colori dell'ambiente legge VSColors definito nel file pkgdef per il componente dell'interfaccia utente. Questi VSColor vengono quindi a cui viene fatto riferimento nel markup o nel codice XAML e vengono caricati tramite IVsUIShell5.GetThemedColor o un DynamicResource mapping.

Environment color service architecture
Architettura del servizio colori ambiente

Accesso al servizio

Esistono diversi modi per accedere al servizio VSColor, a seconda del tipo di token di colore in uso e del tipo di codice in uso.

Colori di ambiente predefiniti

Dal codice nativo

La shell fornisce un servizio che consente l'accesso COLORREF ai colori. Il servizio/interfaccia è:

IVsUIShell2::GetVSSysColorEx(VSSYSCOLOR dwSysColIndex, DWORD *pdwRGBval)

Nel file VSShell80.idl l'enumerazione __VSSYSCOLOREX include costanti colore shell. Per usarlo, passare come valore di indice uno dei valori enum __VSSYSCOLOREX di documentati in MSDN o un numero di indice regolare accettato dall'API di sistema di Windows, GetSysColor, . In questo modo viene restituito il valore RGB del colore che deve essere usato nel secondo parametro.

Se si archivia una penna o un pennello con un nuovo colore, è necessario AdviseBroadcastMessages (fuori dalla shell di Visual Studio) e ascoltare WM_SYSCOLORCHANGE i messaggi e WM_THEMECHANGED .

Per accedere al servizio colori nel codice nativo, si effettuerà una chiamata simile alla seguente:

pUIShell2->GetVSSysColorEx(VSCOLOR_COLOR_NAME, &rgbLOCAL_COLOR);

Nota

I COLORREF valori restituiti da GetVSSysColorEx() contengono solo componenti R,G,B di un colore del tema. Se una voce del tema usa la trasparenza, il valore del canale alfa viene rimosso prima di restituire. Pertanto, se il colore dell'ambiente di interesse deve essere usato in una posizione in cui il canale di trasparenza è importante, è consigliabile usare IVsUIShell5.GetThemedColor invece di IVsUIShell2::GetVSSysColorEx, come descritto più avanti in questo argomento.

Dal codice gestito

L'accesso al servizio VSColor tramite codice nativo è piuttosto semplice. Se si usa codice gestito, tuttavia, è possibile determinare come usare il servizio può risultare difficile. Tenendo presente questo processo, ecco un frammento di codice C# che illustra questo processo:

private void VSColorPaint(object sender, System.Windows.Forms.PaintEventArgs e)
{
    //getIVSUIShell2
    IVsUIShell2 uiShell2 = Package.GetService(typeof(SVsUIShell)) as IVsUIShell2;
    Debug.Assert (uiShell2 != null, "failed to get IVsUIShell2");

    if (uiShell2 != null)
    {
        //get the COLORREF structure
        uint win32Color;
        uiShell2.GetVSSysColorEx((int)__VSSYSCOLOREX.VSCOLOR_SMARTTAG_HOVER_FILL, out win32Color);

        //translate it to a managed Color structure
        Color myColor = ColorTranslator.FromWin32((int)win32Color);
        //use it
        e.Graphics.FillRectangle(new SolidBrush(myColor), 0, 0, 100, 100);
    }
}

Se si lavora in Visual Basic, usare:

Dim myColor As Color = ColorTranslator.FromWin32((Integer)win32Color)
Dall'interfaccia utente WPF

È possibile eseguire il binding ai colori di Visual Studio tramite valori esportati nell'oggetto dell'applicazione ResourceDictionary. Di seguito è riportato un esempio di uso delle risorse della tabella dei colori e del binding ai dati del tipo di carattere dell'ambiente in XAML.

<Style TargetType="{x:Type Button}">
    <Setter Property="TextBlock.FontFamily"
            Value="{DynamicResource VsFont.EnvironmentFontFamily}" />
    <Setter Property="TextBlock.FontSize"
            Value="{DynamicResource VsFont.EnvironmentFontSize}" />
    <Setter Property="Background"
            Value="{DynamicResource VsBrush.EnvironmentBackgroundGradient}" />
</Style>

Classi e metodi helper per il codice gestito

Per il codice gestito, la libreriaMicrosoft.VisualStudio.Shell.12.0.dll Managed Package Framework () della shell contiene un paio di classi helper che facilitano l'uso dei colori a tema.

I metodi helper nella Microsoft.VisualStudio.Shell.VsColors classe in MPF includono GetThemedGDIColor() e GetThemedWPFColor(). Questi metodi helper restituiscono il valore del colore di una voce del tema come System.Drawing.Color o System.Windows.Media.Color, da usare in WinForms o nell'interfaccia utente WPF.

IVsUIShell5 shell5;
Button button = new Button();
button.BackColor = GetThemedGDIColor(shell5, SolutionExplorerColors.SelectedItemBrushKey);
button.ForeColor = GetThemedGDIColor(shell5, SolutionExplorerColors.SelectedItemTextBrushKey);

/// <summary>
/// Gets a System.Drawing.Color value from the current theme for the given color key.
/// </summary>
/// <param name="vsUIShell">The IVsUIShell5 service, used to get the color's value.</param>
/// <param name="themeResourceKey">The key to find the color for.</param>
/// <returns>The current theme's value of the named color.</returns>
public static System.Drawing.Color GetThemedGDIColor(this IVsUIShell5 vsUIShell, ThemeResourceKey themeResourceKey)
{
   Validate.IsNotNull(vsUIShell, "vsUIShell");
   Validate.IsNotNull(themeResourceKey, "themeResourceKey");

   byte[] colorComponents = GetThemedColorRgba(vsUIShell, themeResourceKey);

   // Note: The Win32 color we get back from IVsUIShell5.GetThemedColor is ABGR
   return System.Drawing.Color.FromArgb(colorComponents[3], colorComponents[0], colorComponents[1], colorComponents[2]);
}

private static byte[] GetThemedColorRgba(IVsUIShell5 vsUIShell, ThemeResourceKey themeResourceKey)
{
   Guid category = themeResourceKey.Category;
   __THEMEDCOLORTYPE colorType = __THEMEDCOLORTYPE.TCT_Foreground
   if (themeResourceKey.KeyType == ThemeResourceKeyType.BackgroundColor || themeResourceKey.KeyType == ThemeResourceKeyType.BackgroundBrush)
   {
      colorType = __THEMEDCOLORTYPE.TCT_Background;
   }

   // This call will throw an exception if the color is not found
   uint rgbaColor = vsUIShell.GetThemedColor(ref category, themeResourceKey.Name, (uint)colorType);
   return BitConverter.GetBytes(rgbaColor);
}
public static System.Windows.Media.Color GetThemedWPFColor(this IVsUIShell5 vsUIShell, ThemeResourceKey themeResourceKey)
{
   Validate.IsNotNull(vsUIShell, "vsUIShell");
   Validate.IsNotNull(themeResourceKey, "themeResourceKey");

   byte[] colorComponents = GetThemedColorComponents(vsUIShell, themeResourceKey);

    return System.Windows.Media.Color.FromArgb(colorComponents[3], colorComponents[0], colorComponents[1], colorComponents[2]);
}

La classe può essere usata anche per ottenere gli identificatori VSCOLOR per una determinata chiave della risorsa colore WPF o viceversa.

public static string GetColorBaseKey(int vsSysColor);
public static bool TryGetColorIDFromBaseKey(string baseKey, out int vsSysColor);

I metodi della VsColors classe eseguono query sul servizio VSColor per restituire il valore del colore ogni volta che vengono richiamati. Per ottenere un valore di colore come System.Drawing.Color, un'alternativa con prestazioni migliori consiste nell'usare invece i metodi della Microsoft.VisualStudio.PlatformUI.VSColorTheme classe , che memorizza nella cache i valori di colore ottenuti dal servizio VSColor. La classe sottoscrive internamente gli eventi di trasmissione dei messaggi della shell e rimuove il valore memorizzato nella cache quando si verifica un evento di modifica del tema. Inoltre, la classe fornisce un oggetto . Evento compatibile con NET per sottoscrivere le modifiche del tema. Utilizzare l'evento ThemeChanged per aggiungere un nuovo gestore e usare il GetThemedColor() metodo per ottenere i valori di colore per l'oggetto ThemeResourceKeys di interesse. Un codice di esempio potrebbe essere simile al seguente:

public MyWindowPanel()
{
    InitializeComponent();

    // Subscribe to theme changes events so we can refresh the colors
    VSColorTheme.ThemeChanged += VSColorTheme_ThemeChanged;

    RefreshColors();
}

private void VSColorTheme_ThemeChanged(ThemeChangedEventArgs e)
{
    RefreshColors();

    // Also post a message to all the children so they can apply the current theme appropriately
    foreach (System.Windows.Forms.Control child in this.Controls)
    {
        NativeMethods.SendMessage(child.Handle, e.Message, IntPtr.Zero, IntPtr.Zero);
    }
}

private void RefreshColors()
{
    this.BackColor = VSColorTheme.GetThemedColor(EnvironmentColors.ToolWindowBackgroundColorKey);
    this.ForeColor = VSColorTheme.GetThemedColor(EnvironmentColors.ToolWindowTextColorKey);
}

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        VSColorTheme.ThemeChanged -= this.VSColorTheme_ThemeChanged;
        base.Dispose(disposing);}
}

Scelta dei colori a contrasto elevato

Windows usa diversi temi a livello di sistema a contrasto elevato che aumentano il contrasto del colore del testo, degli sfondi e delle immagini, rendendo gli elementi più distinti sullo schermo. Per motivi di accessibilità, è importante che gli elementi dell'interfaccia di Visual Studio rispondano correttamente quando gli utenti passano a un tema a contrasto elevato.

Solo una manciata di colori di sistema può essere usata per i temi a contrasto elevato. Quando si scelgono i nomi dei colori di sistema, tenere presenti i suggerimenti seguenti:

  • Scegliere i colori di sistema che hanno lo stesso significato semantico dell'elemento che si sta colorando. Ad esempio, se si sceglie un colore a contrasto elevato per il testo all'interno di una finestra, usare WindowText e non ControlText.

  • Scegli coppie di primo piano/sfondo insieme o non sarai sicuro che la tua scelta del colore funzionerà in tutti i temi a contrasto elevato.

  • Determinare quali parti dell'interfaccia utente sono le più importanti e assicurarsi che le aree di contenuto si distingueranno. Si perderà un sacco di dettagli che piccole differenze nella tonalità del colore di solito distinguere, quindi l'uso di colori di bordo forte è comune per definire le aree di contenuto, perché non ci sono varianti di colore per aree di contenuto diverse.

Set di colori di sistema

La tabella nel blog del team WPF: SystemColors Reference indica il set completo di nomi dei colori di sistema e le tonalità corrispondenti visualizzate in ogni tema.

Quando si applica questo set limitato di colori all'interfaccia utente, è previsto che si perdano dettagli sottili presenti nei temi "normali". Ecco un esempio di interfaccia utente con colori grigi sottili usati per distinguere le aree all'interno di una finestra degli strumenti. Se abbinato alla stessa finestra visualizzata in modalità contrasto elevato, è possibile notare che tutti gli sfondi sono uguali e i bordi di tali aree sono indicati solo dal bordo:

Example of how subtle details are lost in High Contrast
Esempio di come i dettagli sottili vengono persi in contrasto elevato

Scelta dei colori del testo in un editor

Il testo colorato viene usato in un editor o in un'area di progettazione per indicare un significato, ad esempio per facilitare l'identificazione di gruppi di elementi simili. In un tema a contrasto elevato, tuttavia, non è possibile distinguere tra più di tre colori di testo. WindowText, GrayText e HotTrackText sono gli unici colori disponibili nelle superfici WindowBackground. Poiché non è possibile usare più di tre colori, scegliere attentamente le differenze più importanti che si desidera visualizzare quando in modalità contrasto elevato.

Tonalità per ogni nome di token consentito in una superficie dell'editor, come appaiono in ogni tema a contrasto elevato:

High Contrast editor comparison
Confronto di editor a contrasto elevato

Esempi dell'area dell'editor nel tema Blu:

Editor in Blue theme
Editor con tema blu

Editor in High Contrast #1 theme
Editor in tema contrasto elevato n. 1

Modelli di utilizzo

Molti elementi comuni dell'interfaccia utente hanno già colori a contrasto elevato definiti. È possibile fare riferimento a questi modelli di utilizzo quando si scelgono nomi di colore di sistema personalizzati, in modo che gli elementi dell'interfaccia utente siano coerenti con componenti simili.

Colore del sistema Utilizzo
ActiveCaption - Glifi dell'IDE attivo e del pulsante della finestra in zattera al passaggio del mouse e premere
- Sfondo della barra del titolo per l'IDE e le finestre in zattere
- Sfondo della barra di stato predefinita
ActiveCaptionText - IDE attivo e finestre in serie per la barra del titolo in primo piano (testo e glifi)
- Sfondo e bordo dei pulsanti della finestra attiva al passaggio del mouse e premere
Controllo - Casella combinata, elenco a discesa e controllo di ricerca predefinito e sfondo disabilitato, incluso il pulsante a discesa
- Ancorare lo sfondo del pulsante di destinazione
- Sfondo della barra dei comandi
- Sfondo della finestra degli strumenti
ControlDark - Sfondo dell'IDE
- Separatori di menu e barre dei comandi
- Bordo barra dei comandi
- Ombreggiature del menu
- Impostazione predefinita della scheda della finestra degli strumenti e passaggio del mouse sul bordo e sul separatore
- Sfondo del pulsante di overflow del documento
- Bordo del glifo di destinazione ancorato
ControlDarkDark - Finestra della scheda documento selezionata senza fuoco
ControlLight - Nascondi automaticamente il bordo scheda
- Casella combinata e bordo elenco a discesa
- Ancorare lo sfondo e il bordo di destinazione
ControlLightLight - Bordo provvisorio selezionato e incentrato
ControlText - Glifo casella combinata e elenco a discesa
- Testo della scheda non selezionato nella finestra degli strumenti
GrayText - Casella combinata ed elenco a discesa disabilitato bordo, glifo a discesa, testo e testo della voce di menu
- Testo del menu disabilitato
- Testo dell'intestazione 'opzioni di ricerca' del controllo di ricerca
- Separatore di sezione del controllo di ricerca
Evidenzia - Tutti gli sfondi e i bordi premuti al passaggio del mouse, ad eccezione dello sfondo del pulsante a discesa casella combinata e del bordo del pulsante di overflow del documento
- Sfondi degli elementi selezionati
HighlightText - Tutto il mouse e premuto in primo piano (testo e glifi)
- Finestra degli strumenti con stato attivo e controllo finestra della scheda documento in primo piano
- Bordo barra del titolo della finestra degli strumenti con stato attivo
- Stato attivo, scheda provvisoria selezionata in primo piano
- Bordo pulsante di overflow del documento al passaggio del mouse e premere
- Bordo icona selezionata
HotTrack - Sfondo e bordo della barra di scorrimento sulla pressione
- Glifo freccia barra di scorrimento alla pressione
InactiveCaption - IDE inattivo e glifi pulsante finestra inattiva al passaggio del mouse
- Sfondo della barra del titolo per l'IDE e le finestre in zattere
- Sfondo del controllo di ricerca disabilitato
InactiveCaptionText - IDE inattivo e barra del titolo delle finestre inattive in primo piano (testo e glifi)
- Sfondo e bordo dei pulsanti finestra inattivi al passaggio del mouse
- Sfondo e bordo del pulsante della finestra degli strumenti non incentrato
- Controllo di ricerca disabilitato in primo piano
Menu - Sfondo del menu a discesa
- Sfondo del segno di spunta selezionato e disabilitato
MenuText - Bordo del menu a discesa
- Segni di spunta
- Glifi di menu
- Testo del menu a discesa
- Bordo icona selezionata
Barra di scorrimento - Barra di scorrimento e sfondo freccia barra di scorrimento, tutti gli stati
Window - Nascondi automaticamente lo sfondo della scheda
- Sfondo della barra dei menu e della mensola dei comandi
- Sfondo della scheda della finestra del documento non con stato attivo o non selezionato e bordo del documento, sia per le schede aperte che provvisorie
- Sfondo della barra del titolo della finestra degli strumenti non messa a fuoco
- Sfondo della scheda della finestra degli strumenti, selezionato e non selezionato
WindowFrame - Bordo IDE
WindowText - Nascondi automaticamente tabulazioni in primo piano
- Scheda della finestra degli strumenti selezionata in primo piano
- Scheda della finestra del documento non con stato attivo e tabulazioni provvisorie non selezionate o non selezionate in primo piano
- Visualizzazione albero predefinita in primo piano e passare il puntatore sul glifo non selezionato
- Bordo scheda selezionato della finestra degli strumenti
- Sfondo, bordo e glifo della barra di scorrimento

Esposizione dei colori per gli utenti finali

A volte si vuole consentire all'utente finale di personalizzare l'interfaccia utente, ad esempio quando si crea un editor di codice o un'area di progettazione. Il modo più comune per eseguire questa operazione consiste nell'usare la finestra di dialogo Opzioni strumenti>. A meno che non si disponga di un'interfaccia utente altamente specializzata che richiede controlli speciali, il modo più semplice per presentare la personalizzazione è tramite la pagina Tipi di carattere e colori all'interno della sezione Ambiente della finestra di dialogo. Per ogni elemento esposto per la personalizzazione, l'utente può scegliere di modificare il colore di primo piano, il colore di sfondo o entrambi.

Creazione di un pacchetto VSPackage per i colori personalizzabili

Un VSPackage può controllare i tipi di carattere e i colori tramite categorie personalizzate e visualizzare gli elementi nella pagina delle proprietà Tipi di carattere e colori. Quando si usa questo meccanismo, i pacchetti VSPackage devono implementare l'interfaccia IVsFontAndColorDefaultsProvider e le interfacce associate.

In linea di principio, questo meccanismo può essere usato per modificare tutti gli elementi di visualizzazione esistenti e le categorie che le contengono. Tuttavia, non deve essere utilizzato per modificare la categoria Editor di testo o i relativi elementi di visualizzazione. Per altre informazioni sulla categoria Editor di testo, vedere Cenni preliminari sui tipi di carattere e sui colori.

Per implementare categorie personalizzate o elementi visualizzati, un VSPackage deve:

  • Creare o identificare le categorie nel Registro di sistema. L'implementazione dell'IDE della pagina delle proprietà Tipi di carattere e colori usa queste informazioni per eseguire correttamente una query per il servizio che supporta una determinata categoria.

  • Creare o identificare i gruppi nel Registro di sistema (facoltativo). Può essere utile definire un gruppo, che rappresenta l'unione di due o più categorie. Se viene definito un gruppo, l'IDE unisce automaticamente le sottocategorie e distribuisce gli elementi visualizzati all'interno del gruppo.

  • Implementare il supporto dell'IDE.

  • Gestire le modifiche di carattere e colore.

Per creare o identificare categorie

Costruire un tipo speciale di voce del Registro di sistema delle categorie in [HKLM\SOFTWARE\Microsoft \Visual Studio\\<Visual Studio version\>\FontAndColors\\<Category\>] dove <Category> è il nome non localizzato della categoria.

Popolare il Registro di sistema con due valori:

Nome Type Dati Descrizione
Category REG_SZ GUID GUID creato per identificare la categoria
Pacchetto REG_SZ GUID GUID del servizio VSPackage che supporta la categoria

Il servizio specificato nel Registro di sistema deve fornire un'implementazione di IVsFontAndColorDefaults per la categoria corrispondente.

Per creare o identificare i gruppi

Costruire un tipo speciale di voce del Registro di sistema delle categorie in [HKLM\SOFTWARE\Microsoft \Visual Studio\\<Visual Studio version\>\FontAndColors\\<group\>] dove <group> è il nome non localizzato del gruppo.

Popolare il Registro di sistema con due valori:

Nome Type Dati Descrizione
Category REG_SZ GUID GUID creato per identificare la categoria
Pacchetto REG_SZ GUID GUID del servizio VSPackage che supporta la categoria

Il servizio specificato nel Registro di sistema deve fornire un'implementazione di IVsFontAndColorGroup per il gruppo corrispondente.

Implementation of IVsFontAndColorGroup
Implementazione di IVsFontAndColorGroup

Per implementare il supporto dell'IDE

Implementare GetObject, che restituisce un'interfaccia IVsFontAndColorDefaults o un'interfaccia IVsFontAndColorGroup all'IDE per ogni categoria o GUID di gruppo fornito.

Per ogni categoria supportata, un VSPackage implementa un'istanza separata dell'interfaccia IVsFontAndColorDefaults .

I metodi implementati tramite IVsFontAndColorDefaults devono fornire all'IDE:

  • Elenchi di elementi visualizzati nella categoria

  • Nomi localizzabili per gli elementi visualizzabili

  • Visualizzare le informazioni per ogni membro della categoria

Nota

Ogni categoria deve contenere almeno un elemento visualizzato.

L'IDE usa l'interfaccia IVsFontAndColorGroup per definire un'unione di diverse categorie.

L'implementazione fornisce all'IDE:

  • Elenco delle categorie che costituiscono un determinato gruppo

  • Accesso alle istanze di IVsFontAndColorDefaults che supportano ogni categoria all'interno del gruppo

  • Nomi di gruppo localizzabili

Aggiornamento dell'IDE

L'IDE memorizza nella cache le informazioni sulle impostazioni carattere e colore. Pertanto, dopo qualsiasi modifica della configurazione del tipo di carattere e del colore dell'IDE, assicurarsi che la cache sia aggiornata è una procedura consigliata.

L'aggiornamento della cache viene eseguito tramite l'interfaccia IvsFontAndColorCacheManager e può essere eseguito a livello globale o solo sugli elementi selezionati.

Gestione delle modifiche dei tipi di carattere e dei colori

Per supportare correttamente la colorazione del testo visualizzato da un VSPackage, il servizio di colorazione che supporta il VSPackage deve rispondere alle modifiche avviate dall'utente apportate tramite la pagina delle proprietà Tipi di carattere e colori.

A tale scopo, un VSPackage deve:

  • gestire gli eventi generati dall'IDE implementando l'interfaccia IVsFontAndColorEvents . L'IDE chiama il metodo appropriato seguendo le modifiche utente della pagina Tipi di carattere e colori. Ad esempio, chiama il metodo OnFontChanged se è selezionato un nuovo tipo di carattere.

    OPPURE

  • eseguire il polling dell'IDE per le modifiche. Questa operazione può essere eseguita tramite l'interfaccia IVsFontAndColor implementata dal sistema Archiviazione. Anche se principalmente per il supporto della persistenza, il metodo GetItem può ottenere informazioni sul tipo di carattere e sul colore per Gli elementi visualizzati. Per altre informazioni sulle impostazioni relative ai tipi di carattere e ai colori, vedere l'articolo MSDN Accesso a tipi di carattere e colori archiviati Impostazioni.

Nota

Per assicurarsi che i risultati del polling siano corretti, usare l'interfaccia IVsFontAndColorCacheManager per determinare se è necessario scaricare e aggiornare la cache prima di chiamare i metodi di recupero dell'interfaccia IVsFontAndColor Archiviazione.

Registrazione di tipi di carattere e categoria di colori personalizzati senza implementare interfacce

L'esempio di codice seguente illustra come registrare il tipo di carattere personalizzato e la categoria di colori senza implementare interfacce:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0Exp\FontAndColors\CSharp Tool Window]
"Package"="{F5E7E71D-1401-11D1-883B-0000F87579D2}"
"Category"="{9FF46859-A47E-47bf-8AC5-EC3DBE69D1FE}"
"ToolWindowPackage"="{7259e420-6241-4e0d-b535-5b820671d183}"

    "NameID"=dword:00000064

Per questo esempio di codice:

  • "NameID" = ID risorsa del nome della categoria localizzata nel pacchetto
  • "ToolWindowPackage" = GUID pacchetto
  • "Category"="{9FF46859-A47E-47bf-8AC5-EC3DBE69D1FE}" è solo un esempio e il valore effettivo può essere un nuovo GUID fornito dall'implementatore.

Impostare il GUID della categoria di proprietà Font e Color

L'esempio di codice seguente illustra l'impostazione dei GUID categoria.

// m_pView is your IVsTextView
IVsTextEditorPropertyCategoryContainer spPropCatContainer =
(IVsTextEditorPropertyCategoryContainer)m_pView;
if (spPropCatContainer != null)
{
IVsTextEditorPropertyContainer spPropContainer;
Guid GUID_EditPropCategory_View_MasterSettings =
new Guid("{D1756E7C-B7FD-49a8-B48E-87B14A55655A}");
hr = spPropCatContainer.GetPropertyCategory(
ref GUID_EditPropCategory_View_MasterSettings,
out spPropContainer);
if(hr == 0)
{
hr =
spPropContainer.SetProperty(
VSEDITPROPID.VSEDITPROPID_ViewGeneral_FontCategory,
catGUID);
hr =
spPropContainer.SetProperty(
VSEDITPROPID.VSEDITPROPID_ViewGeneral_ColorCategory,
catGUID);
}
}