2009-08-05 13 views
12
पार

मैं एक Winform पर इस्तेमाल किया डिफ़ॉल्ट आइकन बदल सकते हैं?बदलें पूरे अनुप्रयोग

मेरे अधिकांश रूपों में उनकी आइकन प्रॉपर्टी कस्टम आइकन पर सेट है। दरारों के माध्यम से पर्ची के कुछ रूपों के लिए, मैं सामान्य "हे देखो, वह इसे दृश्य स्टूडियो में बना" आइकन नहीं चाहता।

एक समाधान यह सुनिश्चित करने के लिए कि मेरे पास कस्टम आइकन सेट है या शोआईकॉन को गलत पर सेट किया गया है, यह सुनिश्चित करने के लिए मेरे प्रत्येक फॉर्म को कड़ाई से जांचना है।

एक और समाधान यह है कि मेरे प्रत्येक फॉर्म को बेस क्लास से प्राप्त किया जाए जो कि कन्स्ट्रक्टर में एक कस्टम आइकन सेट करता है।

उन समाधानों के अलावा, मेरे पास अन्य विकल्प क्या हैं?

संपादित करें: मैं उम्मीद कर रहा था कि स्टॉक आइकन के स्रोत को अपने आप से बदलने का एक तरीका होगा। क्या यह कहीं संसाधन फ़ाइल में है? या यह एक .NET डीएल में एम्बेडेड है जिसे मैं नहीं कर सकता (या वास्तव में, वास्तव में नहीं) संशोधित कर सकता है?

BOUNTY EDIT: क्या कोड के एक पंक्ति को संपादित या लिखने के बिना इसे पूरा करने का कोई तरीका है? मुझे परवाह नहीं है कि समाधान कितना अव्यवहारिक, जटिल, अपशिष्ट समय है ... मैं सिर्फ यह जानना चाहता हूं कि यह संभव है या नहीं। मुझे अपनी जिज्ञासा को पूरा करने की ज़रूरत है।

उत्तर

24

डिफ़ॉल्ट आइकन WinForms dll में अंतर्निहित है - परावर्तक (DefaultIcon) को देखकर यह है:

defaultIcon = new Icon(typeof(Form), "wfc.ico"); 

, कि एक आम स्थान की जांच वहाँ में कोई जादू नहीं है तो आप ऐसा नहीं कर सकते कोड बदलने के बिना।

आप हमेशा क्षेत्र-आधारित प्रतिबिंब के साथ अंधेरे की शक्तियों को गले लगा सकते हैं? नोट: यह हैकी और भंगुर है। अपने सिर पर! लेकिन यह काम करता है:

[STAThread] 
static void Main() { 
    // pure evil 
    typeof(Form).GetField("defaultIcon", 
      BindingFlags.NonPublic | BindingFlags.Static) 
     .SetValue(null, SystemIcons.Shield); 

    // all forms now default to a shield 
    using (Form form = new Form()) { 
     Application.Run(form); 
    } 
} 

इसे ठीक से करने के लिए; दो आम विकल्प;

  • एक आधार Form वर्ग जो आइकन है सेट
  • एक कारखाने Form विधि - शायद कुछ की तरह:

कोड:

public static T CreateForm<T>() where T : Form, new() { 
    T frm = new T(); 
    frm.Icon = ... 
    // any other common code 
    return frm; 
} 

तो बजाय:

using(var frm = new MySpecificForm()) { 
    // common init code 
} 

कुछ की तरह:

using(var frm = Utils.CreateForm<MySpecificForm>()) { 

} 
बेशक

- इतना खूबसूरत नहीं है! एक अन्य विकल्प शायद एक धाराप्रवाह एपीआई के रूप में एक सी # 3.0 विस्तार विधि हो सकता है,:

public static T CommonInit<T>(this T form) where T : Form { 
    if(form != null) { 
     form.Icon = ... 
     //etc 
    } 
    return form; 
} 

और

using(var frm = new MySpecificForm().CommonInit()) { 
    // ready to use 
} 

यह सिर्फ एक .CommonInit() अपने मौजूदा कोड से दूर तो है।

+0

वास्तव में आइकन खोजने के लिए स्वीकार्य ... पर्याप्त –

+0

यह पूर्ण मेगा-कूल है। बस मुझे 50 रूपों पर चलने से बचाया ... –

+0

प्रतिबिंब विकल्प बहुत अच्छा काम करता है, और ओ 2 प्लेटफॉर्म के प्रतिबिंब एपीआई के साथ, ऐसा करने के लिए कोड डरावना टाइपऑफ (फॉर्म) .fieldValue ("defaultIcon", SystemIcons .Shield); –

4

आधार वर्ग विकल्प है कि हम इस्तेमाल करते हैं।

यदि आप एक विकल्प (आवश्यक रूप से अच्छे नहीं) की तलाश में हैं, तो आप: 1. अपने सभी फॉर्मों को चालू करने के लिए आईओसी का उपयोग करें और आईओसी कंटेनर को एप्लिकेशन आइकन सेट करने के लिए संशोधित करें। 2. एप्लिकेशन आइकन सेट करने वाले सभी रूपों में कोड डालने के लिए एओपी का उपयोग करें।

व्यक्तिगत रूप से, मैं सिर्फ आधार वर्ग ...

0

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

1

आप एक दूसरे से सभी चिह्न अद्यतन करना चाहते हैं, तो आप यह है कि सभी * .Designer.vb फ़ाइलों को संपादित करता है (vb.net में) एक छोटे से एप्लिकेशन और InitializeComponent को folowing लाइन जोड़ने का निर्माण कर सकते हैं:

Me.Icon = New System.Drawing.Icon("C:\PathTo\icon.ico") 

आशा है कि यह मदद करता है।

2

मेरे उपयोगी जवाब:

नहीं

के लिए एक अच्छी सुविधा होगी, हालांकि लागू करने के लिए, के बाद से सबसे अधिक क्षुधा पूरा आवेदन भर में एक ही चिह्न का उपयोग माइक्रोसॉफ्ट।

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