从 Visual Studio 工具箱中隐藏 WPF FrameworkElement 的问题

Issue hiding WPF FrameworkElement from the Visual Studio Toolbox

我使用从 FrameworkElement 派生的一些自定义 classes 创建了一个 WPF 自定义控件库,我想从 Visual Studio 工具箱中隐藏其中的一些 classes,但是我得到VS2010 和 VS2013 中的不同问题。

下面是我的自定义控件库的 classes:

[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(false) 上:当我将 dll 文件拖到工具箱中时,它也会显示 PersonObject class。

在 Visual Studio 2013 中,问题出在属性 ToolboxBrowsable(false) 上:当我将 dll 文件拖到工具箱中时,未显示 PersonObject 和 ExpandablePersonObject classes(这没问题) 但如果我进入自定义控件的属性并尝试按 ExpandablePersonObject 属性 附近的新建按钮,我会收到错误消息:"No types are available for you to add to this collection".

我做错了什么?如何使我的 WPF 自定义控件库与 VS2010 和 VS2013 兼容?

编辑: 与此同时,我发现如果我从 UIElement(而不是 FrameworkElement)派生我的 class,那么属性 DesignTimeVisible(false) 在 VS2010 中也能正常工作,但我需要从 FrameworkElement 派生我的 class 以允许数据绑定。

我发现 this article 说:


此 post 涵盖了 VS2010 的两个已知问题。

严重
如果控件程序集安装到 GAC 中并使用 TCI,则必须执行上述两个步骤以将不需要的类型排除在工具箱和选择项之外。

当程序集在 GAC 中时如何限制工具箱中的类型和选择项目对话框:

在设计程序集中,将 ToolboxBrowsableAttribute.No 添加到 public 控件程序集类型的元数据以将其隐藏。

在控件程序集中,使用 DesignTimeVisible(false) 属性修饰 public 类型以将其隐藏。


我试过这种方法,但在 VS2013 中出现错误 "No types are available for you to add to this collection"。

我通过在设计程序集中添加新的 NewItemTypesAttribute(typeof(MyFrameworkElementDerivedClass)) 找到了解决方案。

这样,VS2013 会显示一个下拉列表,用户可以在其中选择项目。