ล่าสุด มีการกล่าวถึงส่วนขยาย VS2010 บ่อยครั้งใน Visual Studio Blog ( http://blogs.msdn.com/visualstudio/ ) ดังนั้นฉันจึงต้องการดูเอกสารประกอบเพื่อศึกษา อย่างไรก็ตาม หลังจากค้นหามาเป็นเวลานาน ยังไม่มีการแนะนำหัวข้อนี้โดยสมบูรณ์ ดังนั้น ฉันต้องค้นหาเนื้อหาที่ได้รับจากเทมเพลตใน VS IDE และคำอธิบายใน Visual Studio Blog อย่างไรก็ตาม ในขณะที่ใช้ 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")] [ส่งออก (typeof (IWpfTextViewCreationListener))] [ContentType ("ข้อความ")] คลาสที่ปิดผนึกภายใน PETextViewCreationListener : IWpfTextViewCreationListener { ถือเป็นโมฆะ IWpfTextViewCreationListener.TextViewCreated (IWpfTextView textView) { //... } }
ด้วยวิธีนี้ VS จะเรียกเมธอด IWpfTextViewCreationListener.TextViewCreated ในเวลาที่เหมาะสมเพื่อแจ้งการเปลี่ยนแปลงสถานะการแก้ไขข้อความ
ในการที่จะลอยแถบเครื่องมือของคุณเอง คุณจะต้องส่งออก AdornmentLayerDefinition และปรับแต่งตำแหน่งการแสดงผลและลำดับของเลเยอร์ Adornment นี้ผ่าน Order Attribute:
[ชื่อ ("QuickToolbarAdornmentLayer")] [สั่งซื้อ (หลัง = "ข้อความ")] [ส่งออก (ประเภท (AdornmentLayerDefinition))] AdornmentLayerDefinition QuickToolbarLayerDefinition { รับ;
Name Attribute ที่นี่มีความสำคัญมาก เราจะใช้มันเพื่อรับ AdornmentLayer ในโค้ดในอนาคต:
this._adornmentLayer = this._textView.GetAdornmentLayer("QuickToolbarAdornmentLayer");
ก้าวไปอีกขั้น กลับไปที่ IWpfTextViewCreationListener.TextViewCreated ตรงนี้ คุณจะได้รับ IWpfTextView
นี่คือเป้าหมายและการนำเสนอของการดำเนินการทั้งหมด นอกจากนี้ จะต้องหยุดการทำงาน Closed, LayoutChanged, MouseHovered, SelectionChanged และกิจกรรมอื่นๆ ไว้เพื่อให้ตอบสนองต่อพฤติกรรมของผู้ใช้
เนื่องจากเราต้องการใช้งานโค้ดผ่านแถบเครื่องมือ เราจึงต้องนำเข้า IEditorOperationsFactoryService ผ่าน MEF:
[นำเข้า] IEditorOperationsFactoryService EditorOperationsFactoryService ภายใน { รับ;
ด้วยวิธีนี้ คุณสามารถรับ IEditorOperations ผ่าน IEditorOperationsFactoryService.GetEditorOperations(ITextView) ใน IWpfTextViewCreationListener.TextViewCreated ด้วยวิธีนี้ คุณสามารถแก้ไขโค้ดได้อย่างสะดวกและรวดเร็ว
ต่อไป เราจำเป็นต้องใช้อินเทอร์เฟซของแถบเครื่องมือ ฉันจะไม่ลงรายละเอียดเกี่ยวกับเรื่องนี้ เพียงสร้าง UserControl และใส่ ToolBar ลงไป แล้วจะแสดง ToolBar นี้เมื่อใดและที่ไหน? ขึ้นอยู่กับเหตุการณ์ SelectionChanged ของ IWpfTextView เหตุการณ์ที่กล่าวถึงข้างต้นถูกนำมาใช้ที่นี่
รหัส
1 โมฆะส่วนตัว 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); 9 ขอบเขตข้อความ GetTextView.GetTextViewLineContainingBufferPosition(endPos) endPos);10 ถ้า (this._fromMouseHover)11 {12 this._mustHaveAdornmentDisplayed = true;13 }14 else15 {16 คุณสมบัติ PELeftButtonMouseProcessor = null;17 try18 {19 คุณสมบัติ = this._textView.Properties.GetProperty<PELeftButtonMouseProcessor>(typeof(PELeftButtonMouseProcessor));20 }21 catch22 {23 }24 this._mustHaveAdornmentDisplayed = (คุณสมบัติ != null)25 && (property.IsLeftButtonDown26 || ((DateTime.Now - property.LastLeftButtonDownTime).TotalMilliseconds < 400.0));27 }28 if (this._mustHaveAdornmentDisplayed)29 {30 TextBounds SelectBounds = !this._textView.Selection.IsReversed ? bounds2 : characterBounds;31 int offset = 7;32 double top = SelectionBounds.Top + (!this._textView.Selection.IsReversed ? (offset + textViewLineContainingBufferPosition.Height) : (-offset - นี่ ._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 ((ซ้าย + this._adornmentUI.ActualWidth) > this._textView.ViewportWidth)39 {40 ซ้าย = this._textView.ViewportWidth - this._adornmentUI.ActualWidth;41 }42 Canvas.SetTop(this._adornmentUI, top);43 Canvas.SetLeft( this._adornmentUI, left);44 ตัวอักษรยาว = 0L;45 try46 {47 ตัวอักษร = this._textView.Selection.SelectedSpans[0].Span.Length;48 }49 catch50 {51 }52 this._adornmentUI.SetStatus(ตัวอักษร) ;53 this.RenderSelectionPopup();54 }55 }56 else57 {58 this._mustHaveAdornmentDisplayed = false;59 this._adornmentLayer.RemoveAdornmentsByTag(this._adornmentTag);60 }61 }62 63 โมฆะส่วนตัว RenderSelectionPopup()64 {65 if ( this._mustHaveAdornmentDisplayed)66 {67 องค์ประกอบ IAdornmentLayerElement = null;68 try69 {70 องค์ประกอบ = this._adornmentLayer.Elements.First<IAdornmentLayerElement>(71 (IAdornmentLayerElement ile) => ile.Tag.ToString() == this._adornmentTag); 72 }73 catch (InvalidOperationException)74 {75 }76 ถ้า (องค์ประกอบ == 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(ผู้ส่งวัตถุ EventArgs e)86 {87 this._fromMouseHover = false;88 this.MayBeAdornmentShowCondition(); 89}90
ควรสังเกตว่าเมื่อจัดการเหตุการณ์ปิดของ IWpfTextView คุณต้องจำไว้ว่าให้ยกเลิกงานที่เสร็จสิ้นทั้งหมดเช่นเหตุการณ์นี้
semi.png(12.70 K)
25-1-2553 16:42:05 น
แถบเครื่องมือ.png(15.64 K)
25-1-2553 16:42:05 น
ถัดไป รวบรวมโปรเจ็กต์และแพ็คเกจ VSIX คุณสมบัติหลักที่ใช้งานอยู่ในปัจจุบันคือ:
1. เมื่อคุณเลือกข้อความในตัวแก้ไขโค้ดและเลื่อนเมาส์ไปที่พื้นที่ข้อความ QuickToolbar จะ "ลอย" ถัดจากข้อความในลักษณะกึ่งโปร่งใส
2. เมื่อเมาส์เคลื่อนไปยังพื้นที่ QuickToolbar QuickToolbar จะกลายเป็นทึบแสง และปุ่มต่างๆ บนแถบเครื่องมือจะตอบสนองต่อการทำงานของเมาส์
3. การดำเนินการที่รองรับในปัจจุบันคือ:
ตัด
สำเนา
แปะ
ลบ
ลดการเยื้อง
เพิ่มการเยื้อง
รหัสความคิดเห็น (ความคิดเห็น)
ไม่แสดงความคิดเห็น
ฯลฯ
วิธีการดาวน์โหลดและติดตั้ง VSIX และซอร์สโค้ดอยู่ในฟอรัม GCDN: [VS2010 Extension] Floating Toolbar ( http://gcdn.grapecity.com/showtopic-345.html )
ให้เป็นเครื่องหมายอะพอสทรอฟีที่เปลี่ยน “เป็นไปไม่ได้” เป็น “ฉันเป็นไปได้”
-------------------------------------------------- -------------------------------------------------- --
บล็อกของ WinkingZhang ( http://winkingzhang.cnblogs.com )
GCDN( http://gcdn.grapecity.com/cs )