首页 > 代码库 > VS2013Xml文件节点导航插件开发

VS2013Xml文件节点导航插件开发

一、功能描述

该插件的功能跟代码文件的导航功能类似,只是下拉框里的内容是元素的某一属性值,如图-1所示

图-1

当点击下拉框的选项后,会自动定位到该内容在xml文件的位置。此功能适用于xml文件内容较多的情况。

二、选择Editor Margin插件模板

因为该插件模板会在编辑区的底部创建一个WPF控件,而你可以创建一个WPF用户控件,并将用户控件添加到该控件里,还可以随意改变该控件的位置。按照该模板的向导建立插件项目,会自

动在项目里添加三个文件source.extension.vsixmanifest、XmlFileNavigation、XmlFileNavigationFactory,改变位置是通过XmlFileNavigationFactory类的MarginContainerAttribute特性实现的,该特性接收PredefinedMarginNames静态类的常量字段,这些常量字段定义了控件可以停靠的位置,如图-2所示。具体的功能主要是在XmlFileNavigation文件里实现。

图-2

当文件打开的时候VS会加载该类运行。

三、创建WPF控件

在项目里添加一个WPF用户控件,在用户控件里添加一个ComboBox下拉控件,当下拉框的选项改变的时候触发定位操作。由于我们是在用户控件里添加下拉控件,在用户控件外部无法监控到下拉框的改变事件,所以我们需要在用户控件里添加一个事件,在下拉框改变事件里触发该事件,这样就可以间接订阅下拉框的选项改变事件。此外,还需要对外开放一个改变下拉框宽度的函数,用于编辑区大小改变的时候可以修改下拉框的宽度。具体的代码如下所示:

 1 namespace XmlFileNavigation 2 { 3     /// <summary> 4     /// MappingInfo.xaml 的交互逻辑 5     /// </summary> 6     public partial class MappingInfo : UserControl 7     { 8         public delegate void DelegateSelectionChanged(object sender, SelectionChangedEventArgs e); 9         public event DelegateSelectionChanged SelectionChanged;10 11         public MappingInfo()12         {13             InitializeComponent();14         }15 16         public MappingInfo(IEnumerable<XElement> elements) {17             InitializeComponent();18             List<Elements> list = new List<Elements>();19             foreach (var item in elements)20             {21                 if (item.Attribute("name") == null)22                     continue;23                 Elements model = new Elements();24                 model.Value = http://www.mamicode.com/item.Attribute("name").Value;25                 string desc = item.Attribute("title") != null ? item.Attribute("title").Value : item.Attribute("remark") == null ? "" : item.Attribute("remark").Value;26                 string cache = item.Attribute("cache") != null ? item.Attribute("cache").Value : "";27                 model.Text = desc != "" ? string.Format("{0}({1})", model.Value, desc) : model.Value;28                 if (cache != "" && cache.Equals("true", StringComparison.OrdinalIgnoreCase))29                 {30                     model.Text += "";31                 }32                 list.Add(model);33             }34             cbElement.DisplayMemberPath = "Text";35             cbElement.SelectedValuePath = "Value";36             cbElement.ItemsSource = list;37             cbElement.SelectedIndex = 0;38             //订阅选项改变时的事件39             cbElement.SelectionChanged += cbElement_SelectionChanged;40         }41 42         void cbElement_SelectionChanged(object sender, SelectionChangedEventArgs e)43         {44             SelectionChanged(sender, e);45         }46 47         public void SetComboBoxWidth(double width) {48             this.cbElement.Width = width;49         }50     }51 52     class Elements53     {54         public string Text { get; set; }55         public string Value { get; set; }56     }57 }

 三、使用户控件自适应编辑区宽度

要实现自适应的功能只需要在XmlFileNavigation类的构造函数里订阅SizeChanged事件,由于XmlFileNavigation类继承了Canvas类,而Canvas类又从其他类继承了SizeChanged事件,所以只要通过this.SizeChanged就可以订阅该事件,在事件里调用创建的用户控件对外开发的修改宽度函数即可。代码如下所示:

/// <summary>/// 大小改变时下拉框也一起调整/// </summary>/// <param name="sender"></param>/// <param name="e"></param>void Navigate_SizeChanged(object sender, SizeChangedEventArgs e){  //调整下拉框大小  //this.cb.Width = ((XmlFileNavigation)sender).ActualWidth;  mapInfo.SetComboBoxWidth(((XmlFileNavigation)sender).ActualWidth);}

 

 

VS2013Xml文件节点导航插件开发