【问题标题】:How to fill a List-property at design-time?如何在设计时填充列表属性?
【发布时间】:2012-01-12 17:16:22
【问题描述】:

我有一个这样的组件:

public partial class FontScalingManager : Component
{
    ...other stuff...

    /// <summary>
    /// List of Controls, which get their Font scaled
    /// </summary>
    [ListBindable(BindableSupport.Yes),
    Description("List of Controls, which get their Font scaled")]
    public List<Control> ScalingControls
    {
        get { return _scalingControls; }
    }
}

所以,在将这个组件放到表单上之后,我想在设计器中填写这个列表。我宁愿在设计器中使用 UITypeEditor 或其他东西手动执行此操作,方法是选择表单中的一些控件。

按原样,设计器自动给我一个编辑器来将新控件添加到此列表中,那么我如何设法告诉它,我想从所有现有控件中进行选择?

我可以为那个编辑器设置一些东西,还是需要一个自定义的?

感谢每一个帮助。

【问题讨论】:

  • Thomas6767:不客气。另外,由于您是 StackOverflow 的新手,我想通知您,您可以通过选中答案旁边的勾号来接受对您帮助最大的答案。

标签: c# custom-component


【解决方案1】:

IExtenderProvider 接口就是为此而设计的。 .NET HelpProvider 组件就是这样实现的。请注意它如何将属性添加到同一窗体上的其他控件。使用 MSDN 库文章中的 the example 获取有关如何正确实现它的基本指导。

【讨论】:

  • 谢谢,当您不知道自己在寻找什么时,很难找到这些东西。一旦尝试,将勾选此答案。
  • 再次感谢,一旦我理解了这个例子,它就像一个魅力。
【解决方案2】:

控件具有Tag 属性。将标签设置为缩放控件的“缩放”。然后在第一次访问时确定缩放控件:

private List<Control> _scalingControls;
public List<Control> ScalingControls
{
    get
    {
        if (_scalingControls == null) {
            _scalingControls = new List<Control>();
            foreach (Control c in frm.Controls) {
                if ((string)c.Tag == "scaling") {
                    _scalingControls.Add(c);
                }
            }
        }
        return _scalingControls;
    }
}

【讨论】:

  • 谢谢,没有想到标签,而是类似的东西。优点:可以在 2 分钟内实现。缺点:递归搜索所有控件,同时需要其中的 30% 快速和肮脏可能会适得其反
猜你喜欢
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
相关资源
最近更新 更多