2016-03-07 20 views
5

Visual Studio Tasarımcısı içinde, özellikler penceresinde, renk seçiciyi kullanarak , BackColor vb. Bir renk seçmek istediğinizde, 'Özel, Web, Sistem' sekmeleri ile bir renk seçici gelir. Özel'i seçerseniz, seçiciye yeni bir renk ekleyebilir, ancak yalnızca alt 2 satırı değiştirilebilir ve değişiklikler denetimler arasında kalıcı olmaz. Böylece palete bir renk eklerseniz, başka bir denetim seçtiğinizde ve örneğin BackColor değiştirmek istediğinizde, daha önce eklediğiniz renkleriniz olmaz.Visual Studio'ya Özel Renk Paleti Renk Özellik Düzenleyicisi

Tasarımcının renk seçici denetimine özel bir renk kümesi oluşturmanın ve içe aktarmanın bir yolu var mı?

Not: Bu soru, VS temaları hakkında soru sormuyor, ya da renkler kod arkasında bir sınıf olarak uygulanabiliyorsa. Tasarımcıyı uyarlamanın bir yolunun peşindeyim.

cevap

4

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:

  • İşte

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. ...

    enter image description here

  • 0

    Ben oldukça bir süre oldu biliyorum

    Sen MergedDictionaries kullanabilir ve bir kaynak Sözlük referans: Biz ekledi iletişim kutusunun alt kısmındaki bu Red de Green, Blue Bak App.xml dosyanız.

    Bu, palette tanımladığınız renkleri koyacaktır, ancak aynı Resource Dictionary'i eklemeniz ve kullandığınız her uygulama için her App.xaml dosyasına başvurmanız gerekir. Farklı uygulamalar için özel renkler kullanmak. Custom Color Palette