C# 如果设置了窗体的AcceptButton,如何自定义按钮?

C# 如果设置了窗体的AcceptButton,如何自定义按钮?,c#,forms,winforms,acceptbutton,C#,Forms,Winforms,Acceptbutton,我用一些附加选项实现了自定义按钮控件。并将我的自定义按钮添加到表单中。当我设置Form.Acception是添加的自定义按钮时,我想在按钮中进行一些自定义。我想自定义自定义按钮类实现中的按钮外观,当它标记为窗体的AcceptButton时 有人建议我如何知道按钮在button类中被标记为表单的AcceptButton吗?错误: public class MyButton : Button { public override void NotifyDefault(bool

我用一些附加选项实现了自定义按钮控件。并将我的自定义按钮添加到表单中。当我设置Form.Acception是添加的自定义按钮时,我想在按钮中进行一些自定义。我想自定义自定义按钮类实现中的按钮外观,当它标记为窗体的AcceptButton时


有人建议我如何知道按钮在button类中被标记为表单的AcceptButton吗?

错误:

public class MyButton : Button
    {
        public override void NotifyDefault(bool value)
        {
            if (this.IsDefault != value)
            {
                this.IsDefault = value;
            }

            if (IsDefault)
            {
                this.BackColor = Color.Red;
            }
            else
            {
                this.BackColor = Color.Green;
            }
        }
    }
public partial class MyButton : Button
{
    public MyButton()
    {
        InitializeComponent();

    }

    protected override void OnCreateControl()
    {
        base.OnCreateControl();

        if (this == FindForm()?.AcceptButton)
            this.BackColor = Color.RosyBrown;
    }
}
受保护的覆盖无效加载(事件参数e) { 基础荷载(e); if(((形式)this.TopLevelControl).AcceptButton==this) .... }

UPD:

public class MyButton : Button
    {
        public override void NotifyDefault(bool value)
        {
            if (this.IsDefault != value)
            {
                this.IsDefault = value;
            }

            if (IsDefault)
            {
                this.BackColor = Color.Red;
            }
            else
            {
                this.BackColor = Color.Green;
            }
        }
    }
public partial class MyButton : Button
{
    public MyButton()
    {
        InitializeComponent();

    }

    protected override void OnCreateControl()
    {
        base.OnCreateControl();

        if (this == FindForm()?.AcceptButton)
            this.BackColor = Color.RosyBrown;
    }
}

您可以遍历父类,通过其基类
控件的父属性来查找表单:

public partial class MyButton : Button
{
    public MyButton()
    {
        InitializeComponent();
    }

    private Form CheckParentForm(Control current)
    {
        // if the current is a form, return it.
        if (current is Form)
            return (Form)current;

        // if the parent of the current not is null, 
        if (current.Parent != null)
            // check his parent.
            return CheckParentForm(current.Parent);

        // there is no parent found and we didn't find a Form.
        return null;
    }

    protected override void OnCreateControl()
    {
        base.OnCreateControl();

        // find the parent form.
        var form = CheckParentForm(this);

        // if a form was found, 
        if (form != null)
            // check if this is set as accept button
            if (this == form.AcceptButton)
                // for example, change the background color (i used for testing)
                this.BackColor = Color.RosyBrown;
    }
}
由于递归,当按钮放置在面板上时,它也可以工作

注意:在调用OnCreateControl之前必须设置accept按钮(例如在表单的构造函数中)


经过一段时间后,我找到了一个标准实现:

您还可以使用:
this.FindForm()


C#6.0中的事件较短:

public class MyButton : Button
    {
        public override void NotifyDefault(bool value)
        {
            if (this.IsDefault != value)
            {
                this.IsDefault = value;
            }

            if (IsDefault)
            {
                this.BackColor = Color.Red;
            }
            else
            {
                this.BackColor = Color.Green;
            }
        }
    }
public partial class MyButton : Button
{
    public MyButton()
    {
        InitializeComponent();

    }

    protected override void OnCreateControl()
    {
        base.OnCreateControl();

        if (this == FindForm()?.AcceptButton)
            this.BackColor = Color.RosyBrown;
    }
}

\o/

@Erm已更新。这是从按钮到窗体的任何引用吗?这个.TopLevelControl?这就是关于没有表单的按钮的问题?)您可以动态创建一个按钮,然后将其添加到表单中。它的父级可以为空。永远不会是一个接受按钮。@garik解释-1?请看我更新的答案,希望它能帮助您。祝你好运