في الآونة الأخيرة، تم ذكر ملحق VS2010 بشكل متكرر على مدونة Visual Studio ( http://blogs.msdn.com/visualstudio/ )، لذلك أردت أن ألقي نظرة على الوثائق لدراستها، ومع ذلك، بعد البحث لفترة طويلة، هناك لم تكن هذه مقدمة كاملة لهذا الموضوع، لذا، كان علي أن أبحث عن المحتوى المقدم من القالب على VS IDE والشرح الموجود على مدونة Visual Studio، أثناء استخدام Reflector، قمت بكتابة بعض الأكواد وأستعدت للتمرين المباشر ، شعرت أن الامتداد الذي أنشأه هذا القالب كان بسيطًا جدًا، وحدث أن رأيت أن AxTool ( http://www.axtools.com/products-vs2010-extensions.php ) يحتوي على ملحق محرر التعليمات البرمجية، وهو أيضًا VS. ملحق، لذلك اتبعت هذا وجعلته خطوة بخطوة.
أولاً، لإنشاء مشروع VS Extension، تحتاج إلى تثبيت VS2010 SDK، وهو الإصدار Beta2 حاليًا، ويمكنك تنزيله من هنا: http://go.microsoft.com/fwlink/?LinkID=165597 ). هنا أستخدم محرر المشروع الذي تم إنشاؤه بواسطة قالب Text Adornment، حسنًا، لن أكتب بالتفصيل كيفية إنشاء مشروع ملحق خاص بك من خلال القالب. إذا لم تكن على دراية بهذا، فيمكنك الرجوع إلى هذا المنشور بواسطة Quan To - بناء ونشر امتداد لبرنامج Visual Studio 2010.
بعد إنشاء المشروع، سيتم إنشاء TextViewCreationListener تلقائيًا ويتم تنفيذ واجهة IWpfTextViewCreationListener هنا، ويتم تصدير كائن IWpfTextViewCreationListener من خلال MEF:
[TextViewRole("DOCUMENT")] [Export(typeof(IWpfTextViewCreationListener))] [ContentType("text")] فئة داخلية مختومة PETextViewCreationListener : IWpfTextViewCreationListener { void IWpfTextViewCreationListener.TextViewCreated(IWpfTextView textView) { //... } }
بهذه الطريقة، سوف يقوم VS باستدعاء الأسلوب IWpfTextViewCreationListener.TextViewCreated في الوقت المناسب لإعلامك بتغيير حالة تحرير النص.
من أجل تعويم شريط الأدوات الخاص بك، تحتاج أيضًا إلى تصدير AdornmentLayerDefinition وتخصيص موضع العرض وترتيب طبقة الزينة هذه من خلال سمة الطلب:
[Name("QuickToolbarAdornmentLayer")] [Order(After = "Text")] [Export(typeof(AdornmentLayerDefinition))] public AdornmentLayerDefinition QuickToolbarLayerDefinition { get };
سمة الاسم هنا مهمة جدًا وسنعتمد عليها للحصول على طبقة الزينة الخاصة بنا في الكود المستقبلي:
this._adornmentLayer = this._textView.GetAdornmentLayer("QuickToolbarAdornmentLayer");
لنذهب خطوة أبعد، دعنا نعود إلى IWpfTextViewCreationListener.TextViewCreated من هنا، يمكنك الحصول على IWpfTextView.
هذا هو الهدف والعرض التقديمي لجميع العمليات، بالإضافة إلى ذلك، يجب تعليق أحداث Closed وLayoutChanged وMouseHovered وSelectionChanged وغيرها من الأحداث من أجل الاستجابة لسلوك المستخدم.
وبما أننا نريد تشغيل التعليمات البرمجية من خلال شريط الأدوات، فنحن بحاجة إلى استيراد IEditorOperationsFactoryService من خلال MEF:
[استيراد] IEditorOperationsFactoryService EditorOperationsFactoryService { get };
بهذه الطريقة، يمكن الحصول على IEditorOperations من خلال IEditorOperationsFactoryService.GetEditorOperations(ITextView) في IWpfTextViewCreationListener.TextViewCreated، ويمكنك من خلاله تحرير التعليمات البرمجية بسهولة وسرعة.
بعد ذلك، نحتاج إلى تنفيذ واجهة شريط الأدوات، ولن أخوض في تفاصيل حول هذا الأمر، فقط قم بإنشاء UserControl ووضع شريط الأدوات فيه. إذن متى وأين يتم عرض شريط الأدوات هذا؟ يعتمد هذا على حدث SelectionChanged الخاص بـ IWpfTextView، ويتم استخدام الحدث المذكور أعلاه هنا.
شفرة
1 public void MayBeAdornmentShowCondition() 2 { 3 if (!this._textView.Selection.IsEmpty) 4 { 5 SnapshotPoint startPos = this._textView.Selection.Start.Position; 6 SnapshotPoint endPos = this._textView.Selection.End.Position; 7 IWpfTextViewLine textViewLineContainingBufferPosition = this._textView.GetTextViewLineContainingBufferPosition(startPos); 8 TextBounds CharacterBounds = textViewLineContainingBufferPosition.GetCharacterBounds(startPos); endPos).GetCharacterBounds(endPos);10 if (this._fromMouseHover)11 {12 this._mustHaveAdornmentDisplayed = true;13 }14 else15 {16 PELeftButtonMouseProcessor property = null;17 Try18 {19 property = this._textView.Properties.GetProperty<PELeftButtonMouseProcessor>(typeof(PELeftButtonMouseProcessor));20 }21 Catch22 {23 }24 this._mustHaveAdornmentDisplayed = (property != null)25 && (property.IsLeftButtonDown26 || ((DateTime.Now - property.LastLeftButtonDownTime).TotalMillithans < 400.0));27 }28 if (this._mustHaveAdornmentDisplayed)29 {30 TextBounds التحديدBounds = !this._textView.Selection.IsReversed ? borders2 : CharacterBounds;31 int Offset = 7;32 double top = التحديدBounds.Top + (!this._textView.Selection.IsReversed ? (إزاحة + textViewLineContainingBufferPosition.Height) : (-إزاحة - هذا ._adornmentUI.ActualHeight));33 if (top < 0.0)34 {35 top = 0.0;36}37 double left = CharacterBounds.Left + ((bounds2.Left - CharacterBounds.Left) / 2.0);38 if ((left) + this._adornmentUI.ActualWidth) > this._textView.ViewportWidth)39 {40 left = this._textView.ViewportWidth - this._adornmentUI.ActualWidth;41 }42 Canvas.SetTop(this._adornmentUI, top);43 Canvas.SetLeft( this._adornmentUI, left);44 حرفًا طويلًا = 0L;45 محاولة46 {47 حرفًا = this._textView.Selection.SelectedSpans[0].Span.Length;48 }49 Catch50 {51 }52 this._adornmentUI.SetStatus(chars) ;53 this.RenderSelectionPopup();54 }55 }56 else57 {58 this._mustHaveAdornmentDisplayed = false;59 this._adornmentLayer.RemoveAdornmentsByTag(this._adornmentTag);60 }61 }62 63 خاص باطل RenderSelectionPopup()64 {65 إذا ( this._mustHaveAdornmentDisplayed)66 {67 IAdornmentLayerElement element = null;68 Try69 {70 element = this._adornmentLayer.Elements.First<IAdornmentLayerElement>(71 (IAdornmentLayerElement ile) => ile.Tag.ToString() == this._adornmentTag); 72 }73 Catch (InvalidOperationException)74 {75}76 if (element == null)77 {78 this._adornmentLayer.AddAdornment(this._textView.Selection.SelectedSpans[0], this._adornmentTag, this._adornmentUI);79 } 80 this._timer.Stop();81 this._timer.Start();82 }83 }84 85 اختيار الفراغ الخاص_SelectionChanged(object sender, EventArgs e)86 {87 this._fromMouseHover = false;88 this.MayBeAdornmentShowCondition(); 89}90
ثم تجدر الإشارة إلى أنه عند التعامل مع الحدث المغلق لـ IWpfTextView، يجب أن تتذكر إلغاء كافة الأعمال النهائية مثل هذا الحدث.
شبه.png(12.70 كيلو)
2010-1-25 16:42:05
شريط الأدوات.png(15.64 كيلو)
2010-1-25 16:42:05
بعد ذلك، قم بتجميع المشروع وحزمة VSIX والميزات الرئيسية المطبقة حاليًا هي:
1. عند تحديد جزء من النص في محرر التعليمات البرمجية وتحريك الماوس إلى منطقة النص، سوف "يطفو" شريط الأدوات السريع بجوار النص بطريقة شبه شفافة.
2. عندما يتحرك الماوس إلى منطقة QuickToolbar، سيصبح شريط QuickToolbar معتمًا، وسوف تستجيب الأزرار الموجودة عليه لإجراءات الماوس.
3. العمليات المدعومة حاليًا هي:
يقطع
ينسخ
لصق
يمسح
إنقاص المسافة البادئة
زيادة المسافة البادئة
رمز التعليق (التعليق)
أزل التعليق
إلخ.
تتوفر طرق تنزيل وتثبيت VSIX وكود المصدر في منتدى GCDN: [امتداد VS2010] شريط الأدوات العائم ( http://gcdn.grapecity.com/showtopic-345.html )
لتكون الفاصلة العليا التي حولت "مستحيل" إلى "أنا ممكن"
-------------------------------------------------- --
مدونة WinkingZhang ( http://winkingzhang.cnblogs.com )
GCDN( http://gcdn.grapecity.com/cs )