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