Görsel stüdyosunda renk seçmenize yardımcı olan editör, farklı denetimlerde özel renkler sürdürmeyen ColorEditor
'dur. Sorunu çözmek için, olmalıdır:
kullandığım kodları da dahil olmak üzere ayrıntılı bir cevaptır Kayıt görsel stüdyo başlangıçta tip Color
için editör ColorEditor
dayalı özel bir UITypeEditor
oluştur sorunu çözmek.
CustomColorEditor ColorEditor
özel ColorPalette
kontrolünü göstermek için özel ColorUI
sınıfını kullanır oluşturun. Palet, özel renkleri göstermek için bir dizi renk kullanır.
CustomColorEditor
oluşturmak için ColorEditor
türetilmiş ve yansıma kullanarak, bu üyeleri bulun ve ilk yüklemede göstermek için bazı renklerin statik bir dizisini kullanarak diziyi doldurdum. Sonra editörü kapattıktan sonra editörden özel renkler alıp statik diziye koyarım ve sonraki statik yükü kullanarak bu statik diziyi kullanarak renk editörünü başlatırım. Bu şekilde, CustomColorEditor
benim tüm örnekleri arasında özel renkler paylaşılır. Belirli türdeki tüm özellikleri için bir ui tipi editörü göstermek için yerine varsayılan ColorEditor
ait
göster CustomColorEditor, türe bir Editor
özelliği eklemeniz gerekir. Ancak, Color
benim türümden değil, Editor
özniteliğini nasıl ekleyebilirim?
TypeDescriptor.AddAttributes
, editöre Color
türünde kayıt yaptırmama yardımcı oldu.
Özniteliği kaydetmek için kodu nerede çalıştırmalıyım? Kesinlikle görsel stüdyo çalışma zamanında!
Bunu yapmak için, bir Visual Studio Paketi projesi oluşturdum ve kayıt kodunu Initialize
yöntem paketine koydum. Ben de bir çözüm açtığımda otomatik yük yapmak için paket sınıfına ProvideAutoLoad
özniteliğini ekledim.
Ardından paketi yükledim.
Sonra dll'yi gacutil.exe /i "path to dll"
kullanarak GAC'ye yerleştirdim. GAC yerine görsel stusio çalışma zamanı, tüm renk özellikleri için özel renk düzenleyicimi göstermek için kullanacağı için Visual Studio'da dll'yi devenv.exe
yakınına koyabilir.
Sonuç Yukarıdaki işlemleri gerçekleştirdikten sonra, ben yeni bir görsel stüdyo örneğini açtı ve benim, Windows Forms proje içinde, benim özel renk editörü renkler için gösterilen görüyoruz. Gösterdiğim başlangıç renkleri. Ayrıca renk editörü, farklı formlar arasında bile özel renkleri devam ettirdi!
Kodları burada paylaştım. Düzenleyiciyi geliştirmek için fikri ve kodları kullanabilirsiniz. Özel renklerinizi başlangıçta editörde gösterecek şekilde sağlayabilirsiniz. Düzenleyiciye başka bir sekme bile ekleyebilirsiniz. Bu Visual Studio özelliğinde sonuç olacağını Paket
[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
için
Kod Renk Editör
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;
}
}
Kodu: İşte benim kodları olduğunu penceresi. ...