我创建了一个WPF自定义控件库,其中一些自定义类派生自FrameworkElement,我想从Visual Studio Toolbox中隐藏一些这些类,但是在VS2010和VS2013中我得到了不同的问题。从Visual Studio工具箱隐藏WPF FrameworkElement的问题
这里我的自定义控制库类之下:
[DesignTimeVisible(false)]
public class PersonObject : FrameworkElement
{
private string _Name = "";
private int _Age = 0;
private Brush _ShirtColor = Brushes.Blue;
public string Name
{
get { return _Name; }
set { _Name = value; }
}
public int Age
{
get { return _Age; }
set { _Age = value; }
}
public Brush ShirtColor
{
get { return _ShirtColor; }
set { _ShirtColor = value; }
}
}
[ToolboxBrowsable(false), TypeConverter(typeof(ExpandableObjectConverter))]
public class ExpandablePersonObject : FrameworkElement
{
private string _Name = "";
private int _Age = 0;
private Brush _ShirtColor = Brushes.Blue;
public string Name
{
get { return _Name; }
set { _Name = value; }
}
public int Age
{
get { return _Age; }
set { _Age = value; }
}
public Brush ShirtColor
{
get { return _ShirtColor; }
set { _ShirtColor = value; }
}
}
在Visual Studio 2010中的问题与属性DesignTimeVisible(假):当我拖动dll文件到工具箱它显示了PersonObject类太。
在Visual Studio 2013中,问题出在ToolboxBrowsable(false)属性上:当我将dll文件拖到工具箱中时,PersonObject和ExpandablePersonObject类没有显示(这是可以的),但是如果我进入属性我的自定义控件,我尝试按下靠近ExpandablePersonObject属性的New按钮,我得到错误:“没有类型可供您添加到此集合中”。
我在做什么错?如何使我的WPF自定义控件库兼容VS2010和VS2013?
编辑: 在此期间,我发现,如果我获得自UIElement(而不是FrameworkElement的)我的课,然后在属性DesignTimeVisible(假)正常工作也在VS2010,但我需要派生自FrameworkElement我的同班同学允许数据绑定。
我发现this article是说:
这篇文章涵盖了VS2010两个已知的问题。
- 仅WPF。 GAC 中安装的衍生自FrameworkElement或更高版本的控制程序集中的公共类型现在需要为 ,并使用System.ComponentModel.DesignTimeVisible(false) 属性进行修饰,以保持该类型不出现在工具箱或 的Choose项目对话框。未使用此属性装饰该类型, 可能会导致类型被添加到工具箱中,并且将导致 的类型在选择项目对话框中列出。
- WPF和Silverlight。使用TCI 安装的控制组件需要使用设计时装配来限制添加到工具箱和选择项目对话框中的类型。如果没有设计时间 程序集,则从FrameworkElement或更高版本派生的所有类型都将放置在工具箱中,并将在选择项对话框中列出。
关键
如果控制组件安装到GAC并使用TCI,你必须实现上面的步骤,以保持不必要的类型从工具箱中和选择项。
如何限制在工具箱类型和选择项对话框时,大会在GAC:
在设计组装,添加ToolboxBrowsableAttribute.No到公共控制组件类型的隐藏它的元数据。
在控件组件中,使用DesignTimeVisible(false)属性修饰公共类型以隐藏它。
我试过这种方法,但这种方式我得到错误“没有类型可供您添加到这个集合”,在VS2013。