2013-03-21 6 views
12

मैं एक विजुअल स्टूडियो पैकेज बना रहा हूं (यह मेरा पहला समय है) और मेरा अंतिम लक्ष्य केवल समाधान एक्सप्लोरर के लिए संदर्भ-मेनू आइटम बनाना है कुछ फ़ाइल प्रकारों पर काम करता है। (मैंने सोचा कि यह एक आम बात होगी, लेकिन इस पर कोई सभ्य ट्यूटोरियल नहीं मिला, इसलिए यदि आप किसी को जानते हैं तो कृपया मुझे बताएं)विजुअल स्टूडियो पैकेज: एक कस्टम समाधान एक्सप्लोरर संदर्भ मेनू आइटम की दृश्यता सेटिंग

मैंने पहले टूलबार में कोई आइटम बनाने के लिए एक साधारण एमएसडीएन गाइड का पालन किया था (मैं भूल जाता हूं कि इसे जोड़ने के लिए कहां था) और यह ठीक काम किया।

फिर मुझे इसे समाधान एक्सप्लोरर संदर्भ मेनू में स्थानांतरित करने का एक तरीका मिला। यह इस तरह .vsct फ़ाइल एक तत्व जोड़ तोड़ और होने से हासिल की थी:

<Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_ITEMNODE"/> 

शायद कोई फर्क नहीं पड़ता कि, लेकिन मैं दृश्य सेट करने के लिए कोशिश कर रहा हूँ।

अब, क्योंकि मैं केवल कुछ फ़ाइल प्रकारों के लिए आइटम दिखाना चाहता हूं, मुझे राइट-क्लिक बटन दबाए जाने पर फ़ाइल को जांचने का एक तरीका ढूंढना होगा। निम्न कोड के साथ समाप्त हो गया एक लंबी खोज के कम found this काटना, मैं और:

protected override void Initialize() 
{ 
    //stuff 
    OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService; 
    menuItem.BeforeQueryStatus += menuItem_BeforeQueryStatus; 
    //more stuff 
} 

void menuItem_BeforeQueryStatus(object sender, EventArgs e) 
{ 
    var myCommand = sender as OleMenuCommand; 
    myCommand.Text = "NEW NAME"; 
} 

ऊपर के उदाहरण मैं सिर्फ कोशिश करते हैं और यह काम करता है साबित करने के लिए पाठ सेट करने के लिए कोशिश कर रहा हूँ में, मैं जानता हूँ कि एक Visible संपत्ति नहीं है लेकिन मैं इस कदम को पहले काम करना चाहता हूं। BeforeQueryStatus ईवेंट निकाल दिया गया है, और डिबगिंग कोड निष्पादन के रूप में अपेक्षित दिखाता है। हालांकि, संदर्भ मेनू आइटम में कोई बदलाव नहीं है, यह मूल पाठ के साथ रहता है।

मुझे यहां क्या याद आ रही है? यह अपडेट क्यों नहीं हो रहा है?

हम निर्दिष्ट करने की आवश्यकता है कि:

उत्तर

20

ठीक है, तो मैं अंत में इस समस्या का समाधान मिल गया है, वहाँ चीजें हैं जो आपको बस इतना करना की एक जोड़ी ...

कदम 1 हैं VSPackage को "ऑटो-लोड" होना चाहिए, हम ऐसा करते हैं ताकि कॉन्टेक्स्टमेनू दिखाए जाने पर कोड निष्पादित हो जाएगा, क्योंकि आम तौर पर यूआईपी दिखाए जाने से पहले VSPackage प्रारंभ नहीं होगा (यानी मेनू आइटम क्लिक किया गया है)। ऐसा करने के लिए हम पैकेज वर्ग के लिए एक विशेषता जोड़ सकते हैं, तो जैसे:

[ProvideAutoLoad("{f1536ef8-92ec-443c-9ed7-fdadf150da82}")] 
public sealed class MyFirstPackage : Package 

आप सोच रहे होंगे क्या कि GUID मान है, अच्छी तरह से इस मामले में यह UICONTEXT_SolutionExists निरंतर का प्रतिनिधित्व करता है, जो पैकेज होगा स्वतः लोड होने का मतलब जब कोई समाधान मौजूद होता है (इसलिए जब हम कोई नया बनाते हैं या लोड करते हैं)। I got this information from here, जैसा कि आप कह सकते हैं कि number of different VSConstants है जिसका उपयोग किया जा सकता है।

कदम 2:

अब जब कि BeforeQueryStatus

यहां पर कुछ अधिक संसाधनों है कि अन्य GUID मूल्यों की सूची है कि इस्तेमाल किया जा सकता हैं कोड सही जगह पर निष्पादित कर रहा है, यह अभी भी भ्रमित है कोड वास्तव में कुछ भी क्यों नहीं बदलता है (मेरे प्रश्न में मैं Text को बदलने का प्रयास करता हूं)।खैर, जवाब यह है, क्योंकि हमें ऐसा करने के लिए पैकेज अनुमति देने की आवश्यकता है (कम से कम जिस तरह से मैं इसे देख रहा हूं)।

ऐसा करने के लिए हमें .vsct फ़ाइल को संपादित करना होगा। वहां के अंदर हम Buttons तत्व पा सकते हैं, जिसके अंदर हमारा ContextMenu Button होना चाहिए। डिफ़ॉल्ट रूप से कुछ टिप्पणियां हैं जो CommandFlag नोड के उपयोग का उल्लेख करती हैं - यह वही है जो हम चाहते हैं।

ताकि हमारे पैकेज Text बदलने के लिए हम निम्नलिखित नोड को जोड़ना होगा अनुमति देने के लिए:

<CommandFlag>TextChanges</CommandFlag> 

अब, यह अपेक्षा के अनुरूप काम करना चाहिए अगर हम VSPackage चलाने!

आप अनुमति मेनू आइटम की Visibility (जो अपने मूल उद्देश्य था) को बदलने के लिए अनुमति देने के लिए देख रहे हैं तो आप उपयोग कर सकते हैं निम्नलिखित CommandFlag:

<CommandFlag>DynamicVisibility</CommandFlag> 

एक full list of command flags here नहीं है, क्या पर विवरण के साथ वे करते हैं।

8

सीधे GUID musefan के जवाब में बताया गया का उपयोग कर के बजाय, आप उपयोग कर सकते हैं: सभी GUID स्थिरांक के लिए UIContextGuids Class:

[ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids.SolutionExists)] 

का संदर्भ लें।

+0

शानदार खोज, मुझे यकीन है कि यह दूसरों के लिए भी बहुत उपयोगी होगा – musefan

+0

किसी कारण से वही गाइड यहां भी मिल सकते हैं: Microsoft.VisualStudio.VSConstants.UICONTEXT। मुझे इस पृष्ठ पर जानकारी मिली। http://www.mztools.com/articles/2013/MZ2013027.aspx –

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