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: