2016-03-07 5 views
5

दृश्य स्टूडियो डिज़ाइनर के भीतर, प्रॉपर्टी विंडो के तहत आप रंगीन पिकर का उपयोग कर ForeColor, BackColor आदि का चयन करने में सक्षम हैं। जब आप रंग चुनना चाहते हैं, तो रंगीन पिकर 'कस्टम, वेब, सिस्टम' टैब के साथ आता है। यदि आप कस्टम का चयन करते हैं, तो आप पिकर में एक नया रंग जोड़ सकते हैं, लेकिन केवल नीचे 2 पंक्तियां बदल सकती हैं, और परिवर्तन नियंत्रण में नहीं रहते हैं। इसलिए यदि आप पैलेट में रंग जोड़ते हैं, तो जब आप एक और नियंत्रण चुनते हैं और उदाहरण के लिए बदलना चाहते हैं उदाहरण के लिए BackColor आपका पिछला जोड़ा रंग वहां नहीं है।विजुअल स्टूडियो रंग संपत्ति संपादक में कस्टम रंग पैलेट

क्या डिजाइनर के रंग-पिकर नियंत्रण में रंगों का एक कस्टम सेट बनाने और आयात करने का कोई तरीका है?

नोट: यह प्रश्न वीएस विषयों के बारे में नहीं पूछ रहा है, या यदि रंग कोड के पीछे रंग के रूप में लागू किया जा सकता है। मैं डिजाइनर को तैयार करने के लिए एक तरीका के बाद हूँ।

उत्तर

4

संपादक जो आपको दृश्य स्टूडियो में रंग लेने में मदद करता है ColorEditor है जो अलग-अलग नियंत्रणों में कस्टम रंगों को जारी नहीं रखता है। समस्या को हल करने के लिए आपको चाहिए:

  • एक कस्टम UITypeEditorColorEditor
  • के आधार पर दृश्य स्टूडियो स्टार्टअप पर प्रकार Color के लिए संपादक बनाएं रजिस्टर

यहाँ कोड जो मैं इस्तेमाल किया सहित एक विस्तृत जवाब है इस समस्या को हल करने के लिए।

CustomColorEditor

ColorEditor एक निजी ColorPalette नियंत्रण को दिखाने के लिए एक निजी ColorUI वर्ग का उपयोग किया गया। पैलेट, कस्टम रंग दिखाने के लिए रंगों की एक सरणी का उपयोग करता है।

CustomColorEditor बनाने के लिए मैंने ColorEditor से व्युत्पन्न किया और प्रतिबिंब का उपयोग करके, उन सदस्यों को पाया और पहले लोड पर दिखाने के लिए कुछ रंगों की एक स्थिर सरणी का उपयोग कर सरणी भर दी। फिर संपादक को बंद करने के बाद, मुझे संपादक से कस्टम रंग मिलते हैं और उन्हें स्थिर सरणी में डालते हैं और अगले लोड पर इस स्थिर सरणी का उपयोग कर रंग संपादक को प्रारंभ करते हैं। इस तरह कस्टम रंग मेरे CustomColorEditor के सभी उदाहरणों के बीच साझा किए जाते हैं।

डिफ़ॉल्ट ColorEditor

के बजाय CustomColorEditor शो में एक विशिष्ट प्रकार के सभी गुण के लिए एक ui प्रकार संपादक दिखाने के लिए, आप प्रकार के लिए एक Editor विशेषता जोड़ना चाहिए। लेकिन चूंकि Color मेरा प्रकार नहीं है, तो मैं इसमें Editor विशेषता कैसे जोड़ सकता हूं?

TypeDescriptor.AddAttributes ने मुझे Color प्रकार के लिए संपादक को पंजीकृत करने में मदद की।

विशेषता को पंजीकृत करने के लिए मुझे कोड कहां चलाया जाना चाहिए? निश्चित रूप से दृश्य स्टूडियो रन-टाइम पर!

ऐसा करने के लिए, मैंने एक विजुअल स्टूडियो पैकेज प्रोजेक्ट बनाया और पंजीकरण कोड को Initialize पैकेज की विधि पर रखा। जब मैं समाधान खोलता हूं तो इसे ऑटो लोड करने के लिए पैकेज क्लास में ProvideAutoLoad विशेषता भी शामिल की गई।

फिर मैंने पैकेज स्थापित किया।

फिर मैंने gacutil.exe /i "path to dll" का उपयोग कर जीएसी में डीएल डाल दिया। जीएसी के बजाय विजुअल स्टूडियो में devenv.exe के पास डीएल भी डाल सकता है क्योंकि दृश्य स्टूडियो रन-टाइम सभी रंग गुणों के लिए मेरे कस्टम रंग संपादक को दिखाने के लिए इसका उपयोग करेगा।

निष्कर्ष

ऊपर कार्य प्रदर्शन के बाद, मैं एक नया दृश्य स्टूडियो उदाहरण खोला और मेरे Windows Forms परियोजना में, मैं अपने कस्टम रंग संपादक रंग के लिए दिखाया गया है देखते हैं। प्रारंभिक रंग जिन्हें मैंने प्रदर्शित किया है। रंगीन संपादक भी विभिन्न रूपों के बीच भी कस्टम रंग जारी रखा!

मैंने यहां कोड साझा किए हैं। आप संपादक को बढ़ाने के लिए विचार और कोड का उपयोग कर सकते हैं। आप शुरुआत में संपादक में दिखाने के लिए अपने कस्टम रंग प्रदान कर सकते हैं। आप संपादक में एक और टैब भी जोड़ सकते हैं।

रंग कोड संपादक

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; 
    } 
} 

कोड के लिए पैकेज

[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

यह दृश्य स्टूडियो संपत्ति में परिणाम होगा: यहाँ मेरी कोड है खिड़की। संवाद के नीचे जो हम जोड़ा में उन Red को देखो, Green, Blue:

enter image description here

0

मैं जानता हूँ कि यह काफी कुछ समय हो गया है ...

आप MergedDictionaries का उपयोग करें और में एक संसाधन शब्दकोश संदर्भित कर सकते हैं आपकी App.xml फ़ाइल।

इससे आपके द्वारा पैलेट में परिभाषित रंग डाले जाएंगे, लेकिन आपको एक ही संसाधन शब्दकोश शामिल करना होगा और आपके द्वारा उपयोग किए जाने वाले प्रत्येक एप्लिकेशन के लिए प्रत्येक App.xaml में इसका संदर्भ देना होगा, जो मेरी राय में अच्छा है क्योंकि कभी-कभी आपके पास विभिन्न अनुप्रयोगों के लिए कस्टम रंगों का उपयोग करने के लिए। Custom Color Palette

कुछ ऐसा

संबंधित मुद्दे