ms word - VSTO वर्ड ऐडिन में एकाधिक दस्तावेज़ों के लिए कस्टम कार्य पेन्स बनाना और प्रबंधित करना




ms-word add-in (2)

मैं विज़ुअल स्टूडियो 2008 में वीएसटीओ का इस्तेमाल करते हुए एक Word 2007-2010 एडिन विकसित कर रहा हूं। मेरे ऐडिन में, प्रत्येक खुले शब्द दस्तावेज़ के लिए कस्टम कार्य फलक की आवश्यकता है I मूल रूप से, मुझे प्रत्येक दस्तावेज़ के लिए एक कार्य फलक बनाने की जरूरत है, दस्तावेज़ विंडो में सही कार्य फलक दिखाएं, दस्तावेज़ पर कुछ करें और उसके बाद कार्य फलक और उसके सभी संदर्भ हटा दें।

यह मैंने इतनी दूर किया है:

टास्क फलक निर्माण

मैं इस तरह लोड दस्तावेज़ पर प्रत्येक नए, खोले या मौजूदा के लिए कस्टम कार्य फलक बना रहा हूं:

((ApplicationEvents4_Event) Application).NewDocument += CreateTaskPaneWrapper;
Application.DocumentOpen += CreateTaskPaneWrapper;
foreach (Document document in Application.Documents)
{
    CreateTaskPaneWrapper(document);
}

CreateTaskPaneWrapper विधि में, मैं एक डिक्शनरी <Document, TaskPaneWrapper> को जांचता हूं यदि कोई दस्तावेज़ के लिए एक कार्य फलक पहले से मौजूद है। मैं ऐसा करता हूं क्योंकि अगर मैं पहले से ही खुले दस्तावेज़ खोलने की कोशिश करता हूं तो खुली घटना आग लगती है I यदि यह अस्तित्व में नहीं है, तो मैं एक नया TaskPaneWrapper वर्ग बना रहा हूँ। इसके निर्माता में, मैं एक नया कार्य फलक बना रहा हूं और इसे कस्टमटास्केपेंस संग्रह में जोड़ता हूं

Globals.ThisAddIn.CustomTaskPanes.Add(taskPane, "Title");

एमएसडीएन के मुताबिक , यह कार्य फलक को वर्तमान सक्रिय विंडो के साथ जोड़ता है।

टास्क फलक बंद

दस्तावेज़ दोनों। बंद करें और आवेदन। दस्तावेज़ पहले क्लोज़ इवेंट मुझे सूट नहीं करते, क्योंकि उपयोगकर्ता दस्तावेज़ को बंद करने के लिए पुष्टिकरण देता है इससे पहले कि वे आग लगाते हैं। इसलिए मैं माइक्रोसॉफ्ट ऑफिस का उपयोग करता हूं.ऑफ़िस। टूल्स। वर्ड। डॉक्यूमेंट। मेरे टास्क पेपरड्राफर क्लास में इस तरह की शट डाउन इवेंट:

_vstoDocument = document.GetVstoObject();
_vstoDocument.Shutdown += OnShutdown;

private void OnShutdown(object sender, EventArgs eventArgs)
{
    Globals.ThisAddIn.CustomTaskPanes.Remove(_taskPane);
    //additional shutdown logic
}

यह सब बहुत अच्छी तरह से काम करने लगता है, कार्य पैनल बनाये जाते हैं, संबंधित विंडो के लिए बाध्य होते हैं, और सफलतापूर्वक हटा दिए जाते हैं हालांकि, मेरे पास अभी भी एक समस्या है - जब मैं Word प्रारंभ करता हूं, एक खाली दस्तावेज़ खुलता है। अगर मैं एक रिक्त दस्तावेज़ को रिक्त किए बिना किसी मौजूदा दस्तावेज़ को खोलता हूं, तो रिक्त दस्तावेज़ और इसकी खिड़की को दस्तावेज़ के बिना हटा दिया गया है। क्लोज़, एपलीकेशन। डॉकट्यूम पहले क्लोज़ और माइक्रोसॉफ्ट.ऑफ़िस। टूल्स.वार्ड.नोट्यूम। शट डाउन इवेंट फायरिंग क्योंकि OnShutdown नहीं कहा जाता है और रिक्त दस्तावेज़ के लिए कार्य फलक को हटा नहीं दिया जाता है, अगली दस्तावेज़ विंडो में दो कार्य-पेन्स होते हैं- बहुत नया, और सबसे पहले (अनाथ) एक मैं इस अनाथ कार्य फलक को कैसे निकाल सकता हूँ? हटाए गए दस्तावेज या खिड़की के संदर्भ में प्रवेश करने से COMException फेंकता है ("ऑब्जेक्ट हटाया गया था")। मैं इस हैक का अस्थायी उपयोग कर रहा हूं:

//A property in my TaskPaneWrapper class
public bool IsWindowAlive()
{
    try
    {
        var window = _vstoDocument.ActiveWindow;
        return true;
    }
    catch (COMException)
    {
        return false;
    }
}

CreateTaskPaneWrapper विधि में, मैं इस संपत्ति को सभी मौजूदा आवरण के लिए जांचता हूं और उन स्थानों को बंद कर देता हूं जहां संपत्ति गलत है। अपवाद को पकड़ना कुछ हद तक महंगा है, ज़ाहिर है, और यह समाधान काफी हैकी है, इसलिए मैं सोच रहा था, क्या कोई बेहतर है? इस प्रश्न में कस्टमटास्केपिन। इंडो संपत्ति को शून्य के लिए चेक किया गया है, लेकिन यह मेरे लिए रिक्त नहीं लौटाता है

इसके अलावा, क्या मैं अपने मौजूदा तर्क का उपयोग कर सकते हैं? कई दस्तावेज़ों के लिए कई कार्य-पैन प्रबंधित करने का विशिष्ट तरीका क्या है?


मेरे पास एक्सेल 2013 में एक ही समस्या है। इसके बारे में केवल कुछ विचार:

1) हो सकता है कि आप वास्तविक "ओपन डॉक्यूमेंट" को ट्रैक करने के लिए DocumentNew- और DocumentOpen-Event में "Word.Application.Documents.Count" की जांच कर सकते हैं।

2) यह जानने के लिए कि क्या कोई दस्तावेज़ पहले से ही खुला है (शायद पुन: सक्रिय सक्रिय दस्तावेज़ के लिए प्रासंगिक हो), आप खुले दस्तावेज़ों के एक शब्दकोश का उपयोग कर सकते हैं। कुंजी अद्वितीय दस्तावेज़ नाम कर सकते हैं।

3) अपने IsWindowAlive () विधि के बजाय आप शायद डिस्पाइज्ड इवेंट को पकड़ सकते हैं:

_vstoDocument.Disposed += _vstoDocument_Disposed;

        void _vstoDocument_Disposed(object sender, EventArgs e)
        {
            //Remove from dictionary of open documents 
        }

आशा करता हूँ की ये काम करेगा...

सादर, जोर्ग


यह समस्या इस MSDN लेख में विस्तृत है जिसमें एकाधिक वर्ड और इन्फ़ोपैथ दस्तावेज़ों में मैनेजिंग टास्क फ़ॉन्सल्स हैं

आपको एक ऐसी विधि तैयार करनी होगी जो अनाथ CTPs को निकाल देती है (यानी कि अब खिड़कियों को संलग्न नहीं किया गया है)।

मैंने इस लेख का पालन किया है और एक कस्टमटास्कपैन प्रबंधक को सफलतापूर्वक लागू किया है जो अनाथों को निकालता है।