8

मैंने विजुअल स्टूडियो 2008 के लिए एक साधारण ऐड-इन लिखा जो एक डॉक्यूबल विंडो फलक खोलता है।विजुअल स्टूडियो 2008 क्यों भूल जाता है कि मेरे ऐड-इन विंडो फलक को डॉक करना है?

You can download the source and a binary installer by clicking here.

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

लेकिन अन्य इंस्टॉलेशन पर जहां भी मैं इसे हमेशा के लिए रखता हूं, यह डॉक रहता है। मैंने मूल रूप से सोचा कि यह Vista और XP के बीच एक अंतर हो सकता है लेकिन अब मेरे पास एक्सपी पर भी अनावश्यक होने की रिपोर्ट है।

जो मैंने पढ़ा है (और तथ्य यह है कि यह कभी-कभी डॉक रहता है) मुझे लगता है कि वीएस को मेरे लिए डॉकिंग स्थिति बचाने की देखभाल करना है। लेकिन यह ऐसा नहीं कर रहा है। और फिर भी उसी वीएस इंस्टॉल पर अन्य प्लगइन्स में यह समस्या नहीं है। इसलिए स्थिति में सुधार करने के लिए मैं कुछ कर सकता हूं।

मुझे लगता है मेरी कोड के केवल प्रासंगिक हिस्सा यह है:

public class Connect : IDTExtensibility2 
{ 
    private static DTE2 _applicationObject; 
    private AddIn _addInInstance; 
    private static CodeModelEvents _codeModelEvents; 

    public static DTE2 VisualStudioApplication 
    { 
     get { return _applicationObject; } 
    } 

    public static CodeModelEvents CodeModelEvents 
    { 
     get { return _codeModelEvents; } 
    } 

    public static event EventHandler SourceChanged = delegate { }; 

    public void OnConnection(object application, 
      ext_ConnectMode connectMode, object addInInst, ref Array custom) 
    { 
     _applicationObject = (DTE2)application; 
     _addInInstance = (AddIn)addInInst; 
    } 

    public void OnStartupComplete(ref Array custom) 
    { 
     try 
     { 
      Events2 events = (Events2)_applicationObject.Events; 
      _codeModelEvents = events.get_CodeModelEvents(null); 

      object objTemp = null; 

      Windows2 toolWins = (Windows2)_applicationObject.Windows; 

      Window toolWin = toolWins.CreateToolWindow2(
       _addInInstance, GetType().Assembly.Location, "Ora.OraPane", "Ora", 
       "{DC8A399C-D9B3-40f9-90E2-EAA16F0FBF94}", ref objTemp); 
      toolWin.Visible = true; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Exception: " + ex.Message); 
     } 
    } 

    public void OnBeginShutdown(ref Array custom) { } 

    public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom) { } 

    public void OnAddInsUpdate(ref Array custom) { } 
} 

(MSDN डॉक्स का सुझाव है कि खिड़की OnConnection में बनाया जाना चाहिए, लेकिन अगर मुझे लगता है कि फिर विंडो ज्यादातर प्रकट नहीं होता है ऐसा ।)

उत्तर

10

मुझे TeamReview (http://www.codeplex.com/TeamReview) के साथ कुछ डॉकिंग मुद्दों का सामना करना पड़ा। मैं नहीं कह सकता कि ऐसा क्यों होता है लेकिन मैं आपको उस कोड को इंगित करने में मदद कर सकता हूं जो हमेशा आपकी विंडो को ऑनस्टार्टअप पूर्ण में डॉक्स करता है। यदि आपके पास कोई विशेष स्थान है, तो आप इसे अपने इच्छित बनाना चाहते हैं, इसे अपने टूल बनाने के बाद और दृश्यमान संपत्ति को कॉल करने से पहले फ्रेम के अंदर होने के लिए लिंक कर सकते हैं। आपको CreateCinkedWindowFrame, और SetKind विधियों के लिए कौन सी स्थिरांक आपकी हालत फिट करनी होगी, इसकी जांच करनी होगी।()> ShowForm

-> TeamReview - -> कमान -> ShowReplayWindowCommand.cs http://www.codeplex.com/TeamReview/SourceControl/changeset/view/16102# 2008: इसके अलावा, आप इस तरह के SolutionExplorer

EnvDTE80.Window2 frame = toolWins.CreateLinkedWindowFrame(toolWin, toolWin, vsLinkedWindowType.vsLinkedWindowTypeTabbed); 


frame.SetKind(EnvDTE.vsWindowType.vsWindowTypeToolWindow); 


_applicationObject.MainWindow.LinkedWindows.Add(frame); 

frame.Activate(); 

यह नमूना के रूप में MainWindow के अलावा कुछ करने के लिए अपने खिड़की से जोड़ने के लिए चाहते हो सकता है के समान है

आउटपुट विंडो, कमांड विंडो और समाधान एक्सप्लोरर को एक साथ जोड़ने के लिए यहां a good Microsoft example है। यह फिर इन लिंक्ड विंडो की चौड़ाई और ऊंचाई में हेरफेर करता है, और अंत में यह उन सभी को लिंक किए गए विंडो फ्रेम से हटा देता है।

+0

इस तरह के एक विस्तृत सहायक उत्तर के लिए धन्यवाद। मैं वास्तव में क्या चाहता हूं कि मेरे फलक के लिए उपयोगकर्ता कहां रखा जाए, लेकिन मुझे लगता है कि मुझे एक साथ कुछ हैक करना होगा जो इसे अनुमानित करता है। –

+0

यहां एक एडिन विकसित करना। यह पोस्ट पूरी तरह से सहायक था। यदि उसने इसके वोट को नहीं हटाया तो दो बार वोट दिया होगा: पी। –

+0

यह उत्तर उपयोगी है लेकिन टूलविंडो को डॉक किए जाने के लिए बहुत कुछ काम करने की आवश्यकता है जहां उपयोगकर्ता ने इसे छोड़ा था। Juozas Kontvainis उत्तर बहुत आसान है और मेरे लिए काम करता है (कई अन्य समाधानों की कोशिश करने के बाद, जिनमें से कोई भी काम नहीं करता)। – Polyfun

1

मुझे लेखक के समान समस्या है। मैंने देखा कि विजुअल स्टूडियो 2005 सत्र विंडो के बाद केवल "विंडो भूल जाता है" जिसमें डीबगिंग का उपयोग किया गया था।

स्वीकार्य उत्तर बहुत मदद नहीं करता है क्योंकि टूल विंडो हमेशा नीचे डॉक हो जाती है। मैं वास्तव में उपयोगकर्ताओं को यह चुनने में सक्षम होना चाहता हूं कि वे कहां डॉक करना चाहते हैं और जहां वे पसंद करते हैं, उन्हें डॉकिंग करके अपनी प्राथमिकता को सहेजना चाहते हैं।

+0

मैं सहमत हूं। अगर किसी के पास बेहतर सुझाव है, तो मैं इसके बजाय इसे स्वीकार करूंगा! –

1

यहां मेरे लिए क्या मदद मिली है। मैं विजुअल स्टूडियो 2005 का उपयोग करता हूं, लेकिन यह आपकी मदद भी कर सकता है।

public void OnBeginShutdown(ref Array custom) 
{ 
    if (_toolWin != null) 
      _toolWin.Visible = false; 
} 
+0

मैंने कोशिश की लेकिन इससे कोई फर्क नहीं पड़ता। –

+1

क्या आपने कोई टूल देखा है जब आपकी टूल विंडो अनदेखी हो जाती है? मेरे लिए समस्या डीबगिंग थी, यानी अगर मैंने विजुअल स्टूडियो शुरू किया और डीबगिंग शुरू नहीं किया, तो मेरी एडिन टूल विंडो ठीक काम करती है, अगर मैंने कुछ डीबग किया - तो अगले सत्र में इसे अनदेखा कर दिया जाएगा। –

+0

+1 यह मेरे लिए भी काम करता प्रतीत होता है, और मैं विजुअल स्टूडियो 2008 का उपयोग कर रहा हूं। मेरा अनुमान है कि जब आप टूल विंडो अदृश्य बनाते हैं, तो वीएस अपना आकार और स्थान बचाता है। मुझे इसे अदृश्य बनाने से पहले टूल विंडो की दृश्यता स्थिति को भी सहेजने की आवश्यकता थी। – Polyfun

0

टूलविंडो दृश्यता को झूठी कार्यों के लिए वास्तव में अच्छी तरह से सेट करना। धन्यवाद जेके।

डीबग के बाद अनदेखा करने के बारे में जेके के प्रश्न का उत्तर देने के लिए, मुझे आश्चर्य है कि परियोजनाओं में devenv.exe/resetaddin स्विच डीबग गुणों का कारण बनता है। यह निश्चित रूप से addin बनाता है सब कुछ रीसेट करता है।

आइडिया: जब आप कोई एडिन प्रोजेक्ट बनाते हैं तो रीसेटडिन स्विच स्वचालित रूप से डीबग कॉन्फ़िगरेशन में जोड़ा जाता है। मैं सामान्य रूप से/x रीसेटडिन कमांड में वर्ग नाम के फ़ॉन्ट को 'एक्स' के रूप में एक अमान्य चार डालता हूं, ताकि जब हम हार्ड रीसेट करना चाहते हैं तो इसे आसानी से पुनः सक्षम किया जा सके। हर बार जब हम डीबग करते हैं तो रीसेट की आवश्यकता नहीं होती है!

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