今天小編給大家分享一下如何使用模板Editor ViewPort Adornment實(shí)現(xiàn)擴(kuò)展的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
公司主營(yíng)業(yè)務(wù):做網(wǎng)站、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出海州免費(fèi)做網(wǎng)站回饋大家。
第一步:創(chuàng)建一個(gè)Viewport Adornment項(xiàng)目
我們從Extensibility中選擇Viewport Adornment模板創(chuàng)建一個(gè)項(xiàng)目。這將生成一個(gè)SourceManifest文件和兩個(gè)類文件。一個(gè)是Adornment類本身,另外一個(gè)是AdornmentFactory類。
第二步:添加一個(gè)WPF用戶控件
右鍵單擊項(xiàng)目,選擇添加一個(gè)新的WPF用戶控件。為了簡(jiǎn)單起見,我使用了一個(gè)用戶控件。這個(gè)用戶控件實(shí)際上包含一個(gè)Expander控件,設(shè)置它的ExpandDirection = Left,它里面又包含了一些TextBlock控件和另外一個(gè)Expander ,設(shè)置里面的這個(gè)Expander的ExpandDirection = Down。看下面的代碼(我刪除不必要的元素,使其更簡(jiǎn)單):
<Expander ExpandDirection="Left" Style="{DynamicResource ExpanderStyle1}" x:Name="expMain" > <StackPanel> <TextBlock x:Name="txtNoLines" Text="No of Lines : {0}" Margin="25 25 25 0" FontSize="12" FontFamily="Verdana" FontWeight="Bold" Foreground="Yellow"></TextBlock> <TextBlock x:Name="txtNoCharacters" Text="No of Characters : {0}" Margin="25 5 25 15" FontSize="12" FontFamily="Verdana" FontWeight="Bold" Foreground="Yellow"></TextBlock> <Expander x:Name="expCodeInfo" ExpandDirection="Down" Header="Code Information"> <StackPanel> <TextBlock x:Name="txtClassInfo" Margin="25 25 25 0" FontSize="12" FontFamily="Verdana" FontWeight="Bold" Foreground="LightYellow"/> <Line Margin="0,4" SnapsToDevicePixels="True" Stroke="Gold" Stretch="Fill" X1="0" X2="1" /> <TextBlock x:Name="txtFileSize" Margin="25 5 25 15" FontSize="12" FontFamily="Verdana" FontWeight="Bold" Foreground="AliceBlue"/> </StackPanel> </Expander> </StackPanel> </Expander>
你可以看到,代碼很簡(jiǎn)單,兩個(gè)Expanders,一個(gè)用來顯示基本的統(tǒng)計(jì)信息和另外一個(gè)顯示擴(kuò)展的統(tǒng)計(jì)信息。我還使用StackPanel來固定TextBlocks布局?,F(xiàn)在,如果你看一下后臺(tái)代碼,發(fā)現(xiàn)它也一樣簡(jiǎn)單。其實(shí)我已經(jīng)創(chuàng)建了一個(gè)CodeInfoTracker類,用它來為我們分析源代碼文件。我只是為我們的用戶控件添加了一個(gè)構(gòu)造函數(shù),使用戶控件更具擴(kuò)展性而已。
private CodeInfoTracker _cinfo; private CodeInfoTracker.Calculators _calculator; public ucInfoBox(CodeInfoTracker cinfo) : this() { this._cinfo = cinfo; } public void UpdateInfo(CodeInfoTracker info) { _calculator = info.PerFormCalculate(); this.txtNoLines.Text = string.Format("No of Lines : {0}", _calculator.no_of_lines); this.txtNoCharacters.Text = string.Format("No of Characters : {0}", _calculator.no_of_characters); this.txtFileSize.Text = string.Format("Total File Size : {0}", _calculator.totalfilesize); StringBuilder builder = new StringBuilder(); if (this._calculator.interfaces != 0) builder.AppendFormat("Interfaces : {0}\n\r", this._calculator.interfaces); if (this._calculator.namespaces != 0) builder.AppendFormat("NameSpaces : {0}\n\r", this._calculator.namespaces); if (this._calculator.classes != 0) builder.AppendFormat("Classes : {0}\n\r", this._calculator.classes); if (this._calculator.methods != 0) builder.AppendFormat("Methods : {0}\n\r", this._calculator.methods); if (this._calculator.properties != 0) builder.AppendFormat("Properties : {0}\n\r", this._calculator.properties); if (this._calculator.fields != 0) builder.AppendFormat("Fields : {0}\n\r", this._calculator.fields); if (this._calculator.comments != 0) builder.AppendFormat("Comments : {0}\n\r", this._calculator.comments); if (builder.Length > 0) { this.txtClassInfo.Visibility = System.Windows.Visibility.Visible; this.txtClassInfo.Text = builder.ToString(); } else { this.txtClassInfo.Text = ""; this.txtClassInfo.Visibility = System.Windows.Visibility.Hidden; } }
使用了一個(gè)結(jié)構(gòu)體Calculators ,這個(gè)結(jié)構(gòu)體放置在我們的自定義類中,它有幾個(gè)int屬性用來保存分析源文件獲取的所有信息。 info.PerFormCalculate(); 給出分析的結(jié)果。這里使用的所有獲取的信息來更新了UIElements。
第三步:創(chuàng)建獲取源文件信息的類
雖然代碼存在一些復(fù)雜性,但是這個(gè)類其實(shí)很簡(jiǎn)單。我很感謝CS Parser [^],它幫助我自動(dòng)地解析源代碼。這個(gè)類需要一個(gè)IWpfTextView對(duì)象,它代表著Visual Studio 2010文本編輯器。實(shí)際上WpfTextView實(shí)現(xiàn)了IWpfTextView。在執(zhí)行期間這個(gè)類接受這個(gè)對(duì)象。
我可以從WPFTextView.TextSnapshot.GetText()獲得到了源代碼。在我調(diào)用的這個(gè)分析的時(shí)候,我只需要檢測(cè)的代碼是什么語(yǔ)言寫的。開始我想自己來實(shí)現(xiàn),但是感謝上帝,我在WPFTextView中發(fā)現(xiàn)已經(jīng)存在這個(gè)對(duì)象了。
public enum Language { CSharp, VisualBasic, Indeterminate } internal Language DetectLanguage { get { string langtype = this._view.FormattedLineSource.TextAndAdornmentSequencer. SourceBuffer.ContentType.DisplayName; if(langtype.Equals("CSHARP", StringComparison.InvariantCultureIgnoreCase)) return Language.CSharp; else if(langtype.Equals("BASIC", StringComparison.InvariantCultureIgnoreCase)) return Language.VisualBasic; else return Language.Indeterminate; } }
DetectLanguage妥善地利用WPFTextView對(duì)象的FormattedLineSource.TextAndAdornmentSequencer。SourceBuffer.ContentType.DisplayName,這個(gè)屬性告訴我是使用了哪種語(yǔ)言。之后我創(chuàng)建了一個(gè)新的方法PerFormCalculate,用它來解析源代碼,它返回一個(gè)Calculation結(jié)構(gòu)對(duì)象。
第四步:創(chuàng)建 Adornment Factory 類
回到這個(gè)擴(kuò)展,我創(chuàng)建一個(gè)Adornment(InfoBoxAdornmentFactory)的Factory類。這個(gè)類繼承IWpfTextViewCreationListener,用來監(jiān)聽WPF的編輯和創(chuàng)建事件。
[Export(typeof(IWpfTextViewCreationListener))] [ContentType("text")] [TextViewRole(PredefinedTextViewRoles.Document)] internal sealed class InfoBoxAdornmentFactory : IWpfTextViewCreationListener { [Export(typeof(AdornmentLayerDefinition))] [Name("AlwaysVisibleInfoBox")] [Order(After = PredefinedAdornmentLayers.Selection)] [TextViewRole(PredefinedTextViewRoles.Interactive)] public AdornmentLayerDefinition editorAdornmentLayer = null; public void TextViewCreated(IWpfTextView textView) { new AlwaysVisibleInfoBox(textView); } }
這里,你可以看到我在這個(gè)類上使用了很多Attributes,像ContentType,它定義了我們只處理文本格式的編輯器;還有TextViewRole,它定義了將被這個(gè)類處理的textview的類型。在這個(gè)類中,我創(chuàng)建了一個(gè)AdornmentLayerDefination對(duì)象??赡苣阆胫牢覀儧]有使用它,無什么還需要定義它呢,它只是用來配置屬性的。Order屬性指定,當(dāng),InfoBox在層被選之后監(jiān)聽,Name是編輯擴(kuò)展的名字。
第五步:創(chuàng)建Adornment 類
Adornment類實(shí)際創(chuàng)建了一個(gè)WPF用戶控件對(duì)象,并設(shè)置它的視圖畫布。在內(nèi)部構(gòu)造函數(shù)中,我處理IWpfTextView.LayoutChanged事件,當(dāng)代碼修改或者布局改變的時(shí)候,就觸發(fā)這個(gè)事件。
因此,通過這一事件,當(dāng)我們編輯的文檔時(shí),我們可以很容易地得到回調(diào)。當(dāng)瀏覽器編輯器的大小改變時(shí),我還通過處理WPFTextView.ViewportHeightChanged,WPFTextView.ViewportWidthChanged得到回調(diào),使我們可以重新定位相應(yīng)的UserControl。
public AlwaysVisibleInfoBox(IWpfTextView view) { _view.LayoutChanged += this.OnLayoutChanged; this.GetLayer(); } private void GetLayer() { _adornmentLayer = this._view.GetAdornmentLayer("AlwaysVisibleInfoBox"); _view.ViewportHeightChanged += delegate { this.onSizeChange(); }; _view.ViewportWidthChanged += delegate { this.onSizeChange(); }; } private void OnLayoutChanged(object sender, TextViewLayoutChangedEventArgs e) { this._info = new CodeInfoTracker(_view); this.infobox.UpdateInfo(this._info); } public void onSizeChange() { _adornmentLayer.RemoveAllAdornments(); Canvas.SetLeft(infobox, _view.ViewportRight - 255); Canvas.SetTop(infobox, _view.ViewportTop + 10); _adornmentLayer.AddAdornment(AdornmentPositioningBehavior.ViewportRelative, null, null, infobox, null); }
因此,構(gòu)造函數(shù)只是調(diào)用GetLayer來獲取的Layer對(duì)象,發(fā)生在ViewportHeightChanged和ViewportWidthChanged ViewPortSizeChage事件。當(dāng)一個(gè)布局改變時(shí),我就能更新這個(gè)用戶的控件。至此,我們成功地建立我們的擴(kuò)展。你可以使用F5運(yùn)行它,它會(huì)打開一個(gè)Visual Studio 2010的Experimental實(shí)例。
安裝和卸載這個(gè)擴(kuò)展:
安裝和卸載這個(gè)擴(kuò)展是非常容易的。當(dāng)您編譯項(xiàng)目后,它會(huì)產(chǎn)生一個(gè)VSIX文件。您可以只需雙擊這個(gè)文件,它會(huì)自動(dòng)安裝到Visual Studio 2010。
以上就是“如何使用模板Editor ViewPort Adornment實(shí)現(xiàn)擴(kuò)展”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
本文題目:如何使用模板EditorViewPortAdornment實(shí)現(xiàn)擴(kuò)展
網(wǎng)頁(yè)路徑:http://jinyejixie.com/article12/psihgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、微信小程序、微信公眾號(hào)、動(dòng)態(tài)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)