【问题标题】:Custom browsable property for Form at design time设计时表单的自定义可浏览属性
【发布时间】:2016-08-11 11:16:53
【问题描述】:

我想在设计时为可浏览的 Windows 窗体创建一个自定义属性,但我的努力都没有成功。显而易见的解决方案似乎是将 browsable 属性设置为 true:

[Browsable(true),
EditorBrowsable(EditorBrowsableState.Always),
Description("Custom Border Colour"),
Category("Custom")]
public Color BorderColour
{
    get
    {
        return bCol;
    }
    set
    {
        bCol = value;
    }
}

但这不起作用。我已经为自定义控件做了很多次,它就像一个魅力,事实上,我什至不需要添加属性,因为默认值为 true。这篇codeproject 的文章似乎做我想做的,就是我上面描述的。 MSDN也是死路一条,还是不知道要找什么。

我尝试将代码添加到Form1.csFrom1.Designer.cs,但没有任何效果。

我是否缺少某些东西,例如我需要为表单设置的某些属性以允许这样做,或者这是不可能的?

我正在使用 Visual Studio Express 2013,如果这会以任何方式影响结果。


编辑:Reza 回答后的尝试:根据 Reza 的建议,this question 提出了有关此主题的更详细问题。

【问题讨论】:

  • 编辑答案: 设计师编辑您文件中的第一个类(正如我在第一个链接帖子中提到的)。您已将BaseForm 作为第一类放在.cs 文件中。将其放在单独的文件中或将BaseForm 的代码移到Form1 代码之后。
  • 一般情况下最好将BaseForm的代码分开,所以最好在项目中添加新表单并将其命名为BaseForm并为表单添加辅助属性,然后为其他表单,添加Inherited Form 或添加新的Form 并手动更改基类名称。

标签: c# winforms properties attributes windows-forms-designer


【解决方案1】:

简答

您应该将该属性添加到表单的基类中,然后您可以在打开子表单时在设计器中看到它:

public class Form1 : BaseForm
{
    public Form1()
    {
        InitializeComponent();
    }
}
public class BaseForm : Form
{
    //The property is not visible in designer of BaseForm
    //But you can see it in designer of Form1

    public string SomeProperty {get;set;}
}

这种行为背后的原因

原因在于设计师的工作方式。当设计者在设计时显示一个表单时,实际上它创建了一个表单基类的实例并显示了它的属性。因此,在设计器中拥有public class Form1:Form,您在设计器中看到的实际上是Form 类的一个实例,以及使用InitializeComponentInitializeComponent 方法设置了哪些属性值的控件实例@ 以及添加的控件使用Form1InitializeComponent 方法。

同样对于用户控件,您无法在用户控件的设计器中看到您的自定义属性,因为您可以在用户控件的设计器中看到的属性是其基类的属性。但是,当您将用户控件的实例放在表单上时,您会看到该实例的属性,即 UserControl1 的属性。

设计器的根元素的属性是根元素的基类的属性。但这些值正是InitializeComponent 中设置的值。

要查找更多信息并查看设计师如何工作的有趣示例,您可以查看此postthis one

【讨论】:

  • 链接帖子中的代码示例和描述很有趣,您会发现它们很有用。我建议您查看链接的帖子。如果您对答案有任何疑问,请告诉我:)
  • 感谢您的建议。在阅读了您的链接和链接中的链接后,我尝试实施您的答案。我想我掌握了 Visual Studio 在做什么,它非常聪明,但是现在发生了一些奇怪的事情,我在我的问题的编辑中添加了这些事情。我做错了吗?
  • @CharlPretorius 欢迎您。虽然我也回答了您编辑的问题,但我相信如果您删除编辑部分并将其作为新问题提出,这会更有用。这样,当前和新的问题和答案将对未来的读者更有用。
  • 太棒了!我终于让这个工作了。我为BaseForm 创建了单独的文件,并由Form1 继承了BaseForm,现在一切正常。我还应该将编辑作为一个新问题提出吗?
  • 这根本不是强制性的,因为问题和答案都对未来的读者非常有用,我建议发布一个新问题以使其更有用。如果您发布了新问题,请通知我,我会发布我的评论编辑答案作为该问题的答案。
猜你喜欢
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 2010-12-16
  • 1970-01-01
  • 2011-09-03
  • 2020-06-19
相关资源
最近更新 更多