亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

VS2013Xml文件節點導航插件開發

2019-11-17 02:45:20
字體:
來源:轉載
供稿:網友

VS2013xml文件節點導航插件開發

一、功能描述

該插件的功能跟代碼文件的導航功能類似,只是下拉框里的內容是元素的某一屬性值,如圖-1所示

圖-1

當點擊下拉框的選項后,會自動定位到該內容在xml文件的位置。此功能適用于xml文件內容較多的情況。

二、選擇Editor Margin插件模板

因為該插件模板會在編輯區的底部創建一個WPF控件,如圖-2所示。

圖-2

而你可以創建一個WPF用戶控件,并將用戶控件添加到該控件里,還可以改變該控件在編輯區的位置。按照Editor Margin模板的向導建立插件項目,在項目里有三個文件:source.extension.vsixmanifest、EditorMargin1、EditorMargin1Factory,改變位置是通過EditorMargin1Factory類的MarginContainerAttribute特性實現的,該特性接收PRedefinedMarginNames靜態類的常量字段,這些常量字段定義了控件可以停靠的位置,如圖-3所示。具體的功能主要是在EditorMargin1文件里實現。

圖-3

當文檔打開的時候VS會加載MarginFactory類的CreateMargin方法執行。

三、創建WPF用戶控件

在項目里添加一個WPF用戶控件,在用戶控件里添加一個ComboBox下拉控件,當下拉框的選項改變的時候觸發定位操作。由于我們是在用戶控件里添加下拉控件,在用戶控件外部無法監控到下拉框的改變事件,所以我們需要在用戶控件里添加一個事件,在下拉框改變事件里觸發該事件,這樣就可以間接訂閱下拉框的選項改變事件。此外,還需要對外開放一個改變下拉框寬度的函數,用于編輯區大小改變的時候可以修改下拉框的寬度。具體的代碼如下所示:

/// <summary>/// MappingInfo.xaml 的交互邏輯/// </summary>public partial class MappingInfo : UserControl{  public delegate void DelegateSelectionChanged(object sender, SelectionChangedEventArgs e);  public event DelegateSelectionChanged SelectionChanged;  public MappingInfo()  {    InitializeComponent();  }  public MappingInfo(IEnumerable<XElement> elements)   {    InitializeComponent();    List<Elements> list = new List<Elements>();    foreach (var item in elements)    {      if (item.Attribute("name") == null)        continue;      Elements model = new Elements();      model.Value = item.Attribute("name").Value;      string desc = item.Attribute("title") != null ? item.Attribute("title").Value : item.Attribute("remark") == null ? "" : item.Attribute("remark").Value;      string cache = item.Attribute("cache") != null ? item.Attribute("cache").Value : "";      model.Text = desc != "" ? string.Format("{0}({1})", model.Value, desc) : model.Value;      if (cache != "" && cache.Equals("true", StringComparison.OrdinalIgnoreCase))      {        model.Text += " √";      }      list.Add(model);    }    cbElement.DisplayMemberPath = "Text";    cbElement.SelectedValuePath = "Value";    cbElement.ItemsSource = list;    cbElement.SelectedIndex = 0;    //訂閱選項改變時的事件    cbElement.SelectionChanged += cbElement_SelectionChanged;  }  void cbElement_SelectionChanged(object sender, SelectionChangedEventArgs e)  {    SelectionChanged(sender, e);  }  public void SetComboBoxWidth(double width)   {    this.cbElement.Width = width;  }}class Elements{  public string Text { get; set; }  public string Value { get; set; }}

在EditorMargin1類的構造函數里將自定義的wpf用戶控件添加到插件創建的控件里

//設置導航欄的相關信息this.Height = 25;this.ClipToBounds = false;this.Background = new SolidColorBrush(Colors.WhiteSmoke);this.Children.Add(mapInfo);//導航欄大小改變時改變下拉框的寬度this.SizeChanged += Navigate_SizeChanged;

四、使用戶控件自適應編輯區寬度

要實現自適應的功能只需要在XmlFileNavigation類的構造函數里訂閱SizeChanged事件,由于EditorMargin1類繼承了Canvas類,而Canvas類又從其他類繼承了SizeChanged事件,所以只要通過this.SizeChanged就可以訂閱該事件,在事件里調用創建的用戶控件對外開發的修改寬度函數即可。代碼如下所示:

/// <summary>/// 大小改變時下拉框也一起調整/// </summary>/// <param name="sender"></param>/// <param name="e"></param>void Navigate_SizeChanged(object sender, SizeChangedEventArgs e){  //調整下拉框大小  //mapinfo為添加的wpf用戶控件  mapInfo.SetComboBoxWidth(((EditorMargin1)sender).ActualWidth); }

為什么要在SizeChanged事件里設置下拉框的寬度,在EditorMargin1類的構造函數里設置就不行嗎?因為在構造函數里獲取編輯區寬度的話,第一個頁面獲取的寬度是不準確的,獲取的寬度都是800,之后打開的頁面的寬度才是正常的。有興趣的同學可以在EditorMargin1類的構造函數里添加如下的代碼,獲取文檔的寬度驗證一下

EnvDTE.DTE dte=ServiceProvider.GlobalProvider.GetService(typeof(DTE)) as DTE;double width = dte.ActiveDocument.ActiveWindow.Width;

五、根據選中的內容進行定位

由于該插件是針對xml文件的,而VS沒有提供對xml文件內容的定位方法(可能是我還不知道),所以只能通過遍歷整個文件來確定選中的內容是在文件中的行數。以下是在用戶控件的響應事件里對選中的內容進行定位的代碼:

/// <summary>/// 下拉框改變事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>void cb_SelectionChanged(object sender, SelectionChangedEventArgs e){  try  {    //獲取下拉框選中項    Elements model = (Elements)((ComboBox)sender).SelectedItem;    //獲取DTE實例    DTE dte = ServiceProvider.GlobalProvider.GetService(typeof(DTE)) as DTE;    //找出選中項在xml文件里的行數    string[] lines = File.ReadAllLines(dte.ActiveDocument.FullName);    int line = 0;    foreach (var item in lines)    {      line++;      if (item != "" && item.Contains(model.Value))      {        break;      }    }    //滾動條滾動到指定行數并顯示光標    TextSelection selection = dte.ActiveDocument.Selection as TextSelection;    if (selection != null)    {      selection.MoveToLineAndOffset(line, 3);      selection.ActivePoint.TryToShow();    }  }  catch (Exception ex)  {    MessageBox.Show(ex.Message, "提示", MessageBoxButton.OK, MessageBoxImage.Error);  }}

如果要開發的導航插件式針對cs文件的話可以通過下面的代碼獲取cs文件里的字段、函數、事件、屬性等的相關信息:

dte.ActiveDocument.ProjectItem.FileCodeModel

以下的代碼是針對ComboBox的美化樣式

  1 <UserControl.Resources>  2         <ControlTemplate x:Key="ComboBoxToggleButton" TargetType="{x:Type ToggleButton}">  3             <Grid>  4                 <Grid.ColumnDefinitions>  5                     <ColumnDefinition />  6                     <ColumnDefinition Width="15" />  7                 </Grid.ColumnDefinitions>  8                 <Border  9   x:Name="Border"  10   Grid.ColumnSpan="2" 11   CornerRadius="0" 12   Background="#FCFCFC" 13   BorderBrush="#9BA7B7" 14   BorderThickness="1 1 1 1" /> 15                 <Border  16   Grid.Column="0" 17   CornerRadius="0"  18   Margin="1"  19   Background="#FCFCFC"  20   BorderBrush="#9BA7B7" 21   BorderThickness="0" /> 22                 <Path  23   x:Name="Arrow" 24   Grid.Column="1"      25   Fill="Black" 26   HorizontalAlignment="Center" 27   VerticalAlignment="Center" 28   Data="M 0 0 L 4 4 L 8 0 Z"/> 29             </Grid> 30             <ControlTemplate.Triggers> 31                 <Trigger Property="ToggleButton.IsMouSEOver" Value="true"> 32                     <Setter TargetName="Border" Property="Background" Value="#FDF4BF" /> 33                     <Setter TargetName="Border" Property="BorderBrush" Value="#FFEC8B" /> 34                 </Trigger> 35                 <Trigger Property="ToggleButton.IsChecked" Value="true"> 36                     <Setter TargetName="Border" Property="Background" Value="#FFEC8B" /> 37                 </Trigger> 38                 <Trigger Property="IsEnabled" Value="False"> 39                     <Setter TargetName="Border" Property="Background" Value="#EEEEEE" /> 40                     <Setter TargetName="Border" Property="BorderBrush" Value="#AAAAAA" /> 41                     <Setter Property="Foreground" Value="#888888"/> 42                     <Setter TargetName="Arrow" Property="Fill" Value="#888888" /> 43                 </Trigger> 44             </ControlTemplate.Triggers>
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情在线观看视频| 欧美一级视频免费在线观看| 中文字幕9999| 国自产精品手机在线观看视频| 亚洲一区二区三区sesese| 美女啪啪无遮挡免费久久网站| 亚洲国产精品人久久电影| 欧美性69xxxx肥| 亚洲精品乱码久久久久久按摩观| 欧美裸体xxxx极品少妇软件| 欧美夫妻性视频| 亚洲国产精品女人久久久| 色综合久久悠悠| 国产精品扒开腿做爽爽爽视频| 美女性感视频久久久| 中文国产成人精品久久一| 国产亚洲美女久久| 欧美精品久久久久久久免费观看| 一区二区欧美久久| 亚洲福利影片在线| 亚洲片国产一区一级在线观看| 国产精品6699| 91精品国产91久久久久久不卡| 亚洲欧美精品在线| 欧美精品videosex极品1| 久久久爽爽爽美女图片| 亚洲国产中文字幕久久网| 国产欧美日韩精品丝袜高跟鞋| 亚洲欧美日韩国产精品| 日韩国产精品亚洲а∨天堂免| 欧美在线一级va免费观看| 亚洲japanese制服美女| 亚洲欧美国产一本综合首页| 麻豆一区二区在线观看| 欧美成人在线网站| 欧美激情二区三区| 91美女片黄在线观看游戏| 亚洲精品日韩丝袜精品| 亚洲春色另类小说| 国产精品免费视频久久久| 国产一区二区三区18| 国产精品视频一区二区三区四| 久久久亚洲福利精品午夜| 91久久久久久久一区二区| 久久久久久18| 亚洲午夜精品久久久久久性色| 日本a级片电影一区二区| 欧美电影在线播放| 国产精品直播网红| 欧美一区二区三区免费观看| 中文字幕亚洲欧美在线| 精品久久久久久亚洲国产300| 欧美日韩综合视频网址| 亚洲精品永久免费精品| 成人精品视频久久久久| 亚洲图片在区色| 国产精自产拍久久久久久蜜| 黑人巨大精品欧美一区二区一视频| 伊人久久免费视频| 亚洲嫩模很污视频| 亚洲影院在线看| 亚洲美女又黄又爽在线观看| 欧美一级大片在线观看| 欧美日本啪啪无遮挡网站| 日韩成人在线网站| 久久亚洲一区二区三区四区五区高| 日韩精品在线视频美女| 国产成人在线一区二区| 精品久久久久久国产| 91久久在线视频| www高清在线视频日韩欧美| 欧美另类精品xxxx孕妇| 国产精品av在线| 亚洲天堂免费在线| 亚洲第一福利网站| 亚洲新中文字幕| 伊人伊人伊人久久| 狠狠躁18三区二区一区| 久久久久久久久久久免费精品| 成人免费视频a| 欧美激情一区二区三区在线视频观看| 成人有码在线播放| 91热精品视频| 亚洲欧美日韩在线高清直播| 亚洲欧洲一区二区三区久久| 亚洲国产高清福利视频| 欧美日韩中国免费专区在线看| 亚洲免费一在线| 亚洲xxxx妇黄裸体| 久久99视频精品| 1769国内精品视频在线播放| 中文字幕亚洲一区二区三区| 久久久久久香蕉网| 日韩精品视频三区| 91网站在线免费观看| 欧美老妇交乱视频| 欧美精品一区在线播放| 亚洲欧美激情四射在线日| 亚洲欧美中文字幕| 精品中文字幕在线| 91sao在线观看国产| 国产一区二区在线免费视频| 欧美制服第一页| 91福利视频在线观看| 91精品国产一区| 亚洲风情亚aⅴ在线发布| 亚洲国产精品久久久| 国产一区私人高清影院| 中文字幕亚洲综合久久筱田步美| 亚洲丝袜在线视频| 国内自拍欧美激情| 久久久av一区| 免费av在线一区| 成人午夜小视频| 久久九九热免费视频| 日韩亚洲第一页| 精品中文字幕在线2019| 欧美第一黄网免费网站| 亚洲国产中文字幕在线观看| 成年人精品视频| 正在播放欧美一区| 55夜色66夜色国产精品视频| 91麻豆国产语对白在线观看| 久久久精品在线观看| 91九色国产社区在线观看| 九色精品美女在线| 4p变态网欧美系列| 国产91|九色| 亚洲女同性videos| 69**夜色精品国产69乱| 日韩美女视频免费看| 国模精品一区二区三区色天香| 久久久精品一区二区三区| 成人免费xxxxx在线观看| 亚洲性生活视频| 91精品久久久久久久| 中文字幕国产精品| 国产一区二区动漫| 欧美黑人性视频| 国产脚交av在线一区二区| 欧美激情xxxxx| 亚洲女在线观看| 欧美性xxxxx极品| 国产精品福利网| 久久精品国产亚洲精品2020| 欧美精品电影在线| www国产精品视频| 国内揄拍国内精品少妇国语| 97avcom| 精品在线小视频| 日韩欧美中文免费| 欧美成人网在线| 国产99视频在线观看| 久久久久久亚洲精品| 久久久国产精品亚洲一区| 欧美理论片在线观看| 亚洲成年人在线| 岛国视频午夜一区免费在线观看| 亚洲第五色综合网| 国产精品久久久久久av下载红粉| 亚洲欧美日韩国产中文| 日韩av综合网站| 亚洲欧美色婷婷| 久久成人精品一区二区三区|