C# C创建自定义控件

C# C创建自定义控件,c#,winforms,custom-controls,C#,Winforms,Custom Controls,我正在尝试根据我使用的特定配置创建一些自定义控件 我的第一个任务就是创建一个标准的退出按钮。然而,它并没有像我想的那样起作用。本质上,我希望在将默认文本添加到表单中时,它是退出应用程序的文本。不幸的是,我所想到的两种方式实际上并没有显示,而是显示了button类的名称,即CustomExitButton1。这是我尝试过的两种方法: public class StandardExitButton : Button { public StandardExitButton() {

我正在尝试根据我使用的特定配置创建一些自定义控件

我的第一个任务就是创建一个标准的退出按钮。然而,它并没有像我想的那样起作用。本质上,我希望在将默认文本添加到表单中时,它是退出应用程序的文本。不幸的是,我所想到的两种方式实际上并没有显示,而是显示了button类的名称,即CustomExitButton1。这是我尝试过的两种方法:

public class StandardExitButton : Button
{

    public StandardExitButton()
    {
        this.ControlAdded += new ControlEventHandler(StandardExitButton_ControlAdded);
    }

    void StandardExitButton_ControlAdded(object sender, ControlEventArgs e)
    {
        Text = "Exit Application";
    }
}
以及:

ControlAdded事件处理程序的工作方式与您认为的不同,请参考示例

这行吗

ControlAdded事件处理程序的工作方式与您认为的不同,请参考示例


这能工作吗?

当控件添加到您的控件时,ControlAdded将启动,而不是当您的控件添加到另一个控件时。您可以改为尝试ParentChanged事件。

ControlAdded将在控件添加到您的控件时触发,而不是在控件添加到另一个控件时触发。您可以改为尝试ParentChanged事件。

您可能需要覆盖按钮公共覆盖字符串文本{get;set;}属性

您可能需要覆盖按钮公共覆盖字符串文本{get;set;}属性

啊-这里的问题是设计器系统执行以下操作:

创建控件的实例 在 构造函数,那么您的文本将退出 申请时间很短。 下一步不管你设置了什么文本 属性,则设计器 将文本显式设置为名称 控制的一部分。
我在构建自定义表单设计器时解决了这个问题,它应该不在您正在做的工作范围之内。我想不出有什么办法可以推翻这种行为…

啊-问题是设计器系统执行以下操作:

创建控件的实例 在 构造函数,那么您的文本将退出 申请时间很短。 下一步不管你设置了什么文本 属性,则设计器 将文本显式设置为名称 控制的一部分。
我在构建自定义表单设计器时解决了这个问题,它应该不在您正在做的工作范围之内。我想不出有什么办法可以推翻这种行为…

你必须做两件事:

将Text属性更改为private以防止设置它:

private new string Text  
{  
    get  
    {  
        return base.Text;  
    }  
    set  
    {  
        base.Text = value;  
    }  
}  
设置默认文本:

public StandardExitButton()  
{  
    this.Text = "Exit Application";  
}  

你必须做两件事:

将Text属性更改为private以防止设置它:

private new string Text  
{  
    get  
    {  
        return base.Text;  
    }  
    set  
    {  
        base.Text = value;  
    }  
}  
设置默认文本:

public StandardExitButton()  
{  
    this.Text = "Exit Application";  
}  

像这样的怎么样

[DefaultValue("Exit Application")]
public override string Text
{
    get
    {
        return base.Text;
    }
    set
    {
        base.Text = value;
    }
}

像这样的怎么样

[DefaultValue("Exit Application")]
public override string Text
{
    get
    {
        return base.Text;
    }
    set
    {
        base.Text = value;
    }
}

使用visual studio designer无法看到它,相反,您需要用代码加载它并运行应用程序以查看指定的文本。

使用visual studio designer无法看到它,相反,您需要加载代码并运行应用程序以查看指定的文本。

我使用了一系列按钮,如添加、编辑、删除、取消、确定、退出等。。。除了用我自己的标准字体大小、颜色等保留我所有的按钮、标签、文本框等。。。对于文本,在每个子类按钮上,我做了如下操作

[ReadOnly(true)]
public override string Text
{ get { return "&Exit Application"; } }
永远不必担心setter,因为按钮的文本在设计器或派生编辑器中永远不会更改

编辑-更完整的样本

public class MyButton : Button
{
    [ReadOnly(true)]
    public sealed override Font Font
    { get { return new Font("Arial", 9F, FontStyle.Italic, GraphicsUnit.Point); } }

    [ReadOnly(true)]
    public sealed override Color ForeColor
    { get { return Color.Blue; } }

    public GDITButton()
    { }
}


public class MyExitButton : MyButton
{
    [ReadOnly(true)]
    public override string Text
    { get { return "Exit"; } }

    public MyExitButton()
    {}
}

public class MyAddButton : MyButton
{
    [ReadOnly(true)]
    public override string Text
    { get { return "Add"; } }

    public MyAddButton()
    {}
}

然后,当您在表单上放置MyExitButton或MyAddButton的实例时,它将强制为您设置标题,并阻止您对其进行更改,因为它是相应类的只读属性。

我使用了一系列按钮,例如添加、编辑、删除、取消、确定、退出等。。。除了用我自己的标准字体大小、颜色等保留我所有的按钮、标签、文本框等。。。对于文本,在每个子类按钮上,我做了如下操作

[ReadOnly(true)]
public override string Text
{ get { return "&Exit Application"; } }
永远不必担心setter,因为按钮的文本在设计器或派生编辑器中永远不会更改

编辑-更完整的样本

public class MyButton : Button
{
    [ReadOnly(true)]
    public sealed override Font Font
    { get { return new Font("Arial", 9F, FontStyle.Italic, GraphicsUnit.Point); } }

    [ReadOnly(true)]
    public sealed override Color ForeColor
    { get { return Color.Blue; } }

    public GDITButton()
    { }
}


public class MyExitButton : MyButton
{
    [ReadOnly(true)]
    public override string Text
    { get { return "Exit"; } }

    public MyExitButton()
    {}
}

public class MyAddButton : MyButton
{
    [ReadOnly(true)]
    public override string Text
    { get { return "Add"; } }

    public MyAddButton()
    {}
}

然后,当您在表单上放置MyExitButton或MyAddButton的实例时,它将强制您添加标题,并阻止您更改标题,因为它是相应类的只读属性。

什么名称空间是DefaultValue?我好像找不到?谢谢什么名称空间是DefaultValue?我好像找不到?谢谢海报把这列为不起作用的东西。海报把这列为不起作用的东西。这对我不起作用。它仍然只是作为标准控件名显示?抱歉,这在程序启动时确实有效。但当程序未运行时,它不会显示文本。谢谢,这对我没用。它仍然只是作为标准控件名显示?抱歉,这在程序启动时确实有效。但当程序未运行时,它不会显示文本。谢谢。看这里的文章-看这里的文章-