设计时自定义可浏览属性的窗体

4

我想在设计时为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的建议,在这个问题中提出了更详细的问题。


1
回答EDIT:设计师编辑了您文件中的第一个类(正如我在第一个链接的帖子中提到的)。您已经将BaseForm放在.cs文件的第一个类中。将其放在单独的文件中或将BaseForm代码移动到Form1代码之后。 - Reza Aghaei
通常最好将BaseForm的代码保持独立,所以最好将新表单添加到项目中并命名为BaseForm,并向该表单添加其他属性,然后对于其他表单,可以添加一个“继承表单”,或添加一个新的“表单”并手动更改基类名称。 - Reza Aghaei
1个回答

8

简短回答

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

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类的实例以及已使用Form1InitializeComponent方法设置属性值的控件实例,以及使用Form1InitializeComponent方法添加的控件实例。
此外,对于用户控件,您无法在用户控件的设计师中看到自定义属性,因为您在用户控件的设计师中可以看到的属性是它基类的属性。但是当您在表单中放置一个用户控件的实例时,您将看到该实例的属性,这是您UserControl1的属性。
您的设计师根元素的属性是根元素基类的属性。但是值恰恰是那些在InitializeComponent中设置的值。
要查找更多信息并查看如何设计师工作的有趣示例,您可以查看此文章这篇文章。

代码示例和链接帖子中的描述非常有趣,你会发现它们很有用。我建议你去看看链接帖子。如果你对答案有任何问题,请告诉我 :) - Reza Aghaei
谢谢您的建议。我在阅读了您提供的链接以及链接中的链接后尝试实现了您的答案。我认为我已经理解了Visual Studio正在做的事情,这很聪明,但现在出现了一些奇怪的事情,我已经在我的问题中进行了编辑。我是不是做错了什么? - ChP
太好了!我终于让它工作了。我为BaseForm创建了一个单独的文件,并通过Form1继承了BaseForm,现在一切都正常了。我是否仍然应该将编辑作为新问题提出? - ChP
我已经在这里发布了新的问题(http://stackoverflow.com/questions/36762789/visual-studio-changes-designer-generated-code-when-i-create-a-new-class-inheriti)。 - ChP
干得好 :) 我回答了你的问题并投了票。我还删除了你的问题中的编辑部分,以使这个问题和答案更加清晰。 - Reza Aghaei
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接