यहाँ मैं क्या मिल सकता है है, मुझे लगता है कि यह आपकी जरूरत के समान ही है। यदि आपके कोई प्रश्न हैं, तो मैं इसे अधिक जानकारी के साथ अपडेट करने जा रहा हूं।
मैं 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));
}
मुझे नहीं लगता कि मैं आपको एक पूर्ण उत्तर दे सकता हूं, दुर्भाग्य से, हालांकि मैं आपको उस दिशा में इंगित कर सकता हूं कि आपको कम से कम IAdornmentLayer को समझने की आवश्यकता होगी (इस तरह आप दृश्य के शीर्ष पर आते हैं)। दृश्य स्वयं IWpfTextView का एक प्रकार है। स्क्रीन पर वास्तविक आइकन खींचने का यह हिस्सा है। सटीक स्थिति का पता लगाने से मैं आपकी मदद नहीं कर सकता क्योंकि मुझे पता नहीं है कि xml-comment ब्लॉक के ऊपरी दाएं को कैसे खोजा जाए, अकेले एक विधि/फ़ील्ड/संपत्ति/वर्ग/आदि से ऊपर है। –
आपको सामान्यीकृत स्नैपशॉटस्पैनकोलेक्शन की आवश्यकता क्यों है ?? क्या आप जानते हैं कि आप वर्तमान संपादक बफर के लिए सभी लाइनों IWpfTextView से प्राप्त कर सकते हैं, और एक साधारण रेगेक्स का उपयोग करके उन सभी मिलान /// जो भी लाइन ढूंढें, फिर उस समन्वय पर एक आइकन, (अपनी सजावट परत में) जोड़ें, उस पर समन्वय प्राप्त करें लाइन? –
नहीं, मुझे इसके बारे में कोई जानकारी नहीं है। मैंने अभी एक उदाहरण देखा है जो एक सामान्यीकृत स्नैपशॉटस्पैंकोलिशन का उपयोग करता है, इसलिए मुझे लगा कि मुझे इसकी आवश्यकता है ... मूल रूप से, कुछ भी जो मुझे निर्देशांक देगा, मुझे झूठी सकारात्मक चीज़ों के बिना चाहिए ताकि मैं वांछित आइकन रख सकूं। – michael