2016-03-07 30 views
5

All'interno di Visual Studio Designer, nella finestra delle proprietà è possibile selezionare ForeColor, BackColor ecc. Utilizzando il selettore colori. Quando si sceglie un colore, un selettore di colori viene visualizzato con le schede "Personalizza, Web, Sistema". Se si seleziona personalizzato, è possibile aggiungere un nuovo colore al selettore, ma solo le 2 righe inferiori sono modificabili e le modifiche non vengono mantenute tra i controlli. Quindi se si aggiunge un colore alla tavolozza, quando si seleziona un altro controllo e si desidera modificare ad esempio BackColor il colore aggiunto precedente non è presente.Tavolozza dei colori personalizzata nell'editor delle proprietà dei colori di Visual Studio

C'è un modo per creare e importare un set personalizzato di colori nel controllo del selettore di colori del designer?

Nota: Questa domanda non riguarda i temi VS, o se i colori possono essere implementati come classe nel code-behind. Sto cercando un modo per personalizzare il designer.

risposta

4

L'editor che consente di selezionare il colore in Visual Studio è ColorEditor che non persiste i colori personalizzati attraverso controlli diversi. Per risolvere il problema, è necessario:

  • crea un personalizzato UITypeEditor sulla base di ColorEditor
  • Registrati l'editor per il tipo Color all'avvio di Visual Studio

Ecco una risposta dettagliata, compresi i codici che ho usato per risolvere il problema.

Creare CustomColorEditor

ColorEditor utilizza una ColorUI classe privata a mostrare un ColorPalette controllo privato. La tavolozza, utilizza una gamma di colori per mostrare i colori personalizzati.

Per creare CustomColorEditor derivato da ColorEditor e utilizzando la riflessione, ho trovato quei membri e riempito l'array utilizzando una matrice statica di alcuni colori da mostrare al primo caricamento. Quindi, dopo aver chiuso l'editor, ottengo colori personalizzati dall'editor e li inserisco nell'array statico e inizializzo l'editor di colori utilizzando questo array statico al prossimo caricamento. In questo modo i colori personalizzati sono condivisi tra tutte le istanze del mio CustomColorEditor.

Visualizza CustomColorEditor al posto di predefinito ColorEditor

Per mostrare un editor di tipo ui per tutte le proprietà di un tipo specifico, si dovrebbe aggiungere un attributo Editor al tipo. Ma dal Color non è il mio tipo, come posso aggiungere ad esso l'attributo Editor?

TypeDescriptor.AddAttributes mi ha aiutato a registrare l'editor per il tipo Color.

Dove devo eseguire il codice per registrare l'attributo? Sicuramente al run-time dello studio visivo!

Per fare ciò, ho creato un progetto di pacchetto Visual Studio e inserito il codice di registrazione nel metodo Initialize. Ho anche aggiunto l'attributo ProvideAutoLoad alla classe del pacchetto per farlo caricare automaticamente quando apro una soluzione.

Quindi ho installato il pacchetto.

Quindi ho inserito la DLL in GAC utilizzando gacutil.exe /i "path to dll". Al posto di GAC è anche possibile inserire la DLL in Visual Studio vicino a devenv.exe poiché il run-time visual stusio lo utilizzerà per mostrare il mio editor di colori personalizzato per tutte le proprietà di colore.

Conclusione

Dopo l'esecuzione di compiti di cui sopra, ho aperto una nuova istanza di Visual Studio e nel mio progetto Windows Form, vedo il mio editor di colore personalizzato mostrato per i colori. I colori iniziali che ho impostato visualizzati. Anche l'editor di colori ha mantenuto i colori personalizzati anche tra forme diverse!

Ho condiviso i codici qui. Puoi usare l'idea e i codici per migliorare l'editor. Puoi fornire i colori personalizzati da mostrare in editor all'inizio. Puoi persino aggiungere un'altra scheda all'editor. Ecco i miei codici:

Codice in Color Editor

class CustomColorEditor : ColorEditor 
{ 
    private static Color[] Colors; 
    static CustomColorEditor() 
    { 
     Colors = new Color[]{ 
      Color.Red, Color.Green, Color.Blue, Color.White, 
      Color.White, Color.White, Color.White, Color.White, 
      Color.White, Color.White, Color.White, Color.White, 
      Color.White, Color.White, Color.White, Color.White, 
     }; 
    } 
    public override object EditValue(ITypeDescriptorContext context, System.IServiceProvider provider, object value) 
    { 
     var colorEditorObject = this; 
     Type colorUiType = typeof(ColorEditor).GetNestedType("ColorUI", BindingFlags.NonPublic); 
     var colorUiConstructor = colorUiType.GetConstructors()[0]; 
     var colorUiField = typeof(ColorEditor).GetField("colorUI", BindingFlags.Instance | BindingFlags.NonPublic); 
     var colorUiObject = colorUiConstructor.Invoke(new[] { colorEditorObject }); 
     colorUiField.SetValue(colorEditorObject, colorUiObject); 
     var palField = colorUiObject.GetType().GetField("pal", BindingFlags.Instance | BindingFlags.NonPublic); 
     var palObject = palField.GetValue(colorUiObject); 
     var palCustomColorsField = palObject.GetType().GetField("customColors", BindingFlags.Instance | BindingFlags.NonPublic); 
     palCustomColorsField.SetValue(palObject, Colors); 
     var selectedValue = base.EditValue(context, provider, value); 
     Colors = palCustomColorsField.GetValue(palObject) as Color[]; 
     return selectedValue; 
    } 
} 

Codice per Package

[PackageRegistration(UseManagedResourcesOnly = true)] 
[InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] 
[Guid(GuidList.guidVSPackage1PkgString)] 
[ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids80.SolutionExists)] 
public sealed class VSPackage1Package : Package 
{ 
    public VSPackage1Package() { } 
    protected override void Initialize() 
    { 
     base.Initialize(); 
     TypeDescriptor.AddAttributes(typeof(Color), new EditorAttribute(typeof(CustomColorEditor), typeof(UITypeEditor))); 
    } 
} 

resut

Questo sarebbe il risultato di proprietà di Visual Studio finestra. Guardate quelli Red, Green, Blue nella parte inferiore della finestra di dialogo che abbiamo aggiunto:

enter image description here

0

io so che è stato un bel po 'di tempo ...

È possibile utilizzare MergedDictionaries e fare riferimento a un dizionario risorse in il tuo file App.xml.

Questo metterà i colori definiti nella tavolozza ma dovresti includere lo stesso dizionario di risorse e farne riferimento in ogni app.xaml per ogni applicazione che usi, il che, a mio parere, è buono perché a volte hai usare colori personalizzati per diverse applicazioni. Custom Color Palette

Qualcosa del genere