繁体   English   中英

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

[英]Issue hiding WPF FrameworkElement from the Visual Studio Toolbox

我使用从FrameworkElement派生的一些自定义类创建了WPF自定义控件库,我想从Visual Studio Toolbox中隐藏其中的某些类,但是在VS2010和VS2013中遇到了不同的问题。

在我的自定义控件库的类下面:

[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类。

在Visual Studio 2013中,问题出在属性ToolboxBrowsable(false):当我将dll文件拖到工具箱中时,不显示PersonObject和ExpandablePersonObject类(这是可以的),但是如果我进入自定义控件的属性并我尝试在ExpandablePersonObject属性附近按“新建”按钮,但出现错误:“没有类型可用于添加到此集合”。

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

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

我发现这篇文章说:


这篇文章涵盖了VS2010的两个已知问题。

  • 仅WPF。 现在要求从GAC框架或更高版本派生的GAC中安装的控制程序集中的公共类型必须使用System.ComponentModel.DesignTimeVisible(false)属性进行修饰,以防止该类型出现在“工具箱”或“选择项”对话框中。 不使用此属性修饰类型,可能会导致将类型添加到工具箱中,并会导致在“选择项”对话框中列出该类型。
  • WPF和Silverlight。 使用TCI安装的控制程序集需要设计时程序集,以限制添加到“工具箱”和“选择项”对话框中的类型。 如果没有设计时程序集,则所有来自FrameworkElement或更高版本的类型都将放置在工具箱中,并将在“选择项”对话框中列出。

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

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

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

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


我尝试了这种方法,但是这样我在VS2013中收到错误“没有类型可用于添加到此集合”。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM