8

मुझे यह पता लगाने में परेशानी हो रही है कि यह कैसे करें और विजुअल स्टूडियो एसडीके संदर्भ या तो बहुत उपयोगी नहीं है।विजुअल स्टूडियो 2010 एसडीके - एक्सएमएल टिप्पणी समूहों के बगल में सजावट कैसे करें?

मैं यह जानने का प्रयास कर रहा हूं कि XML टिप्पणियों के NormalizedSnapshotSpanCollection कैसे प्राप्त करें। मैं एक आइकन उनके बगल में रखना चाहते हैं ... मैं अगले प्रत्येक पंक्ति के लिए एक आइकन नहीं करना चाहती है, लेकिन केवल प्रत्येक समूह की पहली पंक्ति के बगल में ...

///<summary>SomeXML Comment</summary> [ICON] 
///<remarks>some remarks</remarks> 
public void Foo() 
{ 
    ///Some false XML comment line that does not get an icon. 
} 
+0

मुझे नहीं लगता कि मैं आपको एक पूर्ण उत्तर दे सकता हूं, दुर्भाग्य से, हालांकि मैं आपको उस दिशा में इंगित कर सकता हूं कि आपको कम से कम IAdornmentLayer को समझने की आवश्यकता होगी (इस तरह आप दृश्य के शीर्ष पर आते हैं)। दृश्य स्वयं IWpfTextView का एक प्रकार है। स्क्रीन पर वास्तविक आइकन खींचने का यह हिस्सा है। सटीक स्थिति का पता लगाने से मैं आपकी मदद नहीं कर सकता क्योंकि मुझे पता नहीं है कि xml-comment ब्लॉक के ऊपरी दाएं को कैसे खोजा जाए, अकेले एक विधि/फ़ील्ड/संपत्ति/वर्ग/आदि से ऊपर है। –

+0

आपको सामान्यीकृत स्नैपशॉटस्पैनकोलेक्शन की आवश्यकता क्यों है ?? क्या आप जानते हैं कि आप वर्तमान संपादक बफर के लिए सभी लाइनों IWpfTextView से प्राप्त कर सकते हैं, और एक साधारण रेगेक्स का उपयोग करके उन सभी मिलान ///

जो भी लाइन ढूंढें, फिर उस समन्वय पर एक आइकन, (अपनी सजावट परत में) जोड़ें, उस पर समन्वय प्राप्त करें लाइन? –

+0

नहीं, मुझे इसके बारे में कोई जानकारी नहीं है। मैंने अभी एक उदाहरण देखा है जो एक सामान्यीकृत स्नैपशॉटस्पैंकोलिशन का उपयोग करता है, इसलिए मुझे लगा कि मुझे इसकी आवश्यकता है ... मूल रूप से, कुछ भी जो मुझे निर्देशांक देगा, मुझे झूठी सकारात्मक चीज़ों के बिना चाहिए ताकि मैं वांछित आइकन रख सकूं। – michael

उत्तर

12

यहाँ मैं क्या मिल सकता है है, मुझे लगता है कि यह आपकी जरूरत के समान ही है। यदि आपके कोई प्रश्न हैं, तो मैं इसे अधिक जानकारी के साथ अपडेट करने जा रहा हूं।

VS 2010 icon adornment

मैं VS 2010 एसडीके वेब साइट से this sample साथ शुरू कर दिया। यह आपको पहले से ही बहुत करीब है, लेकिन आपको कई और कदमों की आवश्यकता है।


सी # संस्करण डाउनलोड करें, फ़ोल्डर में अनपैक करें, संकलित करें। इसे चलाने और परीक्षण आप परियोजना> गुण> डीबग करने के लिए जाने की जरूरत करने के लिए

आप उदाहरण C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe

के लिए "प्रारंभ बाहरी कार्यक्रम" अपने VS 2010 एप्लिकेशन के लिए विकल्प और पथ सेट, चुनने के लिए आदेश पंक्ति तर्क में की जरूरत है सेट: /rootsuffix Exp

अब आप इसे चलाने खोला वी.एस. में कुछ नमूना प्रोजेक्ट बनाने के लिए सक्षम होना चाहिए, और यदि आप 00AA00 की तरह कहीं भी टाइप एक छह अंकों की संख्या यह इसी रंग के साथ एक आयत के रूप में दिखाया जाएगा। डीबग वीएस उदाहरण बंद करें।


अब कुछ कोड संपादित करें। ColorAdornmentTagger.cs में #define HIDING_TEXT परिभाषित करें टिप्पणी करें। यह पाठ के बगल में सजावट दिखाएगा, इसके बजाए नहीं।

एक ही फाइल तुम कहाँ SnapshotSpan adornmentSpan आरंभ नहीं हो जाता खोजने के लिए और करने के लिए लाइन को बदलने की जरूरत में:

SnapshotSpan adornmentSpan = new SnapshotSpan(colorTagSpans[0].End, 0); 

यह पाठ अवधि के बाद, यह पहले नहीं अलंकरण स्थापित करेंगे।


ColorTagger.cs में। निर्माता में regex बदलें, ताकि निर्माता अब लग रहा है

तरह
internal ColorTagger(ITextBuffer buffer) 
     : base(
     buffer, 
     new[] { new Regex(@"/// <summary>.*", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase) } 
     ) 
    { 
    } 

इस regex विधि कमेंटरी लाइन पहचान करने के लिए सेट हो जाएगा।

इस कक्षा में अन्य विधियों का हम उपयोग नहीं करेंगे, आप उन्हें टिप्पणी कर सकते हैं या कुछ यादृच्छिक रंग वापस कर सकते हैं।


'ColorAdornment.cs' में। यह सजावट डब्ल्यूपीएफ नियंत्रण ही है। पहले बेस क्लास को Button से ContentControl में बदलें। कक्षा के निर्माता को

internal ColorAdornment(ColorTag colorTag) 
    { 
     BitmapImage image = new BitmapImage(); 
     using (FileStream stream = File.OpenRead("c:\\temp\\sologo.png")) 
     { 
      image.BeginInit(); 
      image.StreamSource = stream; 
      image.CacheOption = BitmapCacheOption.OnLoad; 
      image.EndInit(); 
     } 

     this.Content = new Image() { Margin = new Thickness(20,0,0,0), Width = 100, Height = 30, Source = image }; 
    } 

आप जिस छवि पथ की आवश्यकता है उसे छवि पथ बदल सकते हैं।मैंने अभी विकिपीडिया से SO लोगो डाउनलोड किया है और मेरे temp फ़ोल्डर में डाल दिया है।

संकलित और चलाएं। आपको डीबग वीएस इंस्टेंस में टिप्पणियों के बगल में एसओ लोगो देखने में सक्षम होना चाहिए।


कुछ अतिरिक्त टिप्पणी।

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

दूसरा, जब मैं इसे डीबग कर रहा था तो मेरा डीबग वीएस समय-समय पर ठंडा था। मुझे लगता है कि इस IntraTextAdornmentTagger.cs

में ताले से संबंधित हो सकती तुम भी ठंड को देखते हैं, इस तरह से निम्नलिखित विधि को अपडेट करने का प्रयास करें:

protected void InvalidateSpans(IList<SnapshotSpan> spans) 
    { 
     if (spans.Count == 0) 
      return; 
     bool wasEmpty = false; 
     lock (this.invalidatedSpans) 
     { 
      wasEmpty = this.invalidatedSpans.Count == 0; 
      this.invalidatedSpans.AddRange(spans); 
     } 

     if (wasEmpty) 
      this.view.VisualElement.Dispatcher.BeginInvoke(new Action(AsyncUpdate)); 
    } 

और AsyncUpdate इस तरह से:

private void AsyncUpdate() 
    { 
     // Store the snapshot that we're now current with and send an event 
     // for the text that has changed. 
     if (this.snapshot != this.view.TextBuffer.CurrentSnapshot) 
     { 
      this.snapshot = this.view.TextBuffer.CurrentSnapshot; 

      Dictionary<SnapshotSpan, TAdornment> translatedAdornmentCache = new Dictionary<SnapshotSpan, TAdornment>(); 

      foreach (var keyValuePair in this.adornmentCache) 
       translatedAdornmentCache.Add(keyValuePair.Key.TranslateTo(this.snapshot, SpanTrackingMode.EdgeExclusive), keyValuePair.Value); 

      this.adornmentCache = translatedAdornmentCache; 
     } 

     List<SnapshotSpan> spansCopy; 
     lock (this.invalidatedSpans) 
     { 
      spansCopy = this.invalidatedSpans.ToList(); 
      this.invalidatedSpans.Clear(); 
     } 

     List<SnapshotSpan> translatedSpans = spansCopy.Select(s => s.TranslateTo(this.snapshot, SpanTrackingMode.EdgeInclusive)).ToList(); 

     if (translatedSpans.Count == 0) 
      return; 

     var start = translatedSpans.Select(span => span.Start).Min(); 
     var end = translatedSpans.Select(span => span.End).Max(); 

     RaiseTagsChanged(new SnapshotSpan(start, end)); 
    } 
+0

अच्छा, यह निश्चित रूप से एक अच्छा प्रारंभिक बिंदु है। मैं कुछ एल्गोरिदम को यह पता लगाने की उम्मीद कर रहा था कि एक टिप्पणी ब्लॉक एक वैध वर्ग, enum, संरचना, संपत्ति, क्षेत्र, विधि, आदि से ऊपर है, लेकिन यह एक करीब है जैसा कि मैं अब के लिए पाने के लिए मिल रहा है। इस तथ्य में कुछ छेद हैं कि यह '///

* पर निर्भर करता है क्योंकि मैं इसे कहीं और डाल सकता हूं और झूठी सकारात्मक प्राप्त कर सकता हूं (मुझे पता है कि ऐसा करने में कोई अर्थ नहीं है)। बहुत मदद करने के लिए किसी भी तरह से, पूर्ण +200। – michael

+0

इसके अलावा, मुझे devenv.exe कॉल के लिए '/ rootuffix Exp' पैरामीटर की आवश्यकता क्यों है? – michael

+0

@ माइकल: धन्यवाद! '/ Rootuffix Exp' आपके प्रयोग से डिफ़ॉल्ट वीएस की रक्षा करना है http://msdn.microsoft.com/en-us/library/bb166560(v=VS.80).aspx –