执行单击自定义按钮将不起作用

本文关键字:不起作用 按钮 自定义 单击 执行 | 更新日期: 2023-09-27 18:17:19

我有一个按钮的自定义类,当我为任何自定义按钮触发PerformClick时,没有任何反应。这是代码:

我的自定义类的声明

public class NonFocusButton : Button
{
    public NonFocusButton()
    {
        SetStyle(ControlStyles.Selectable, false);
    }
}
List<NonFocusButton> buttons = new List<NonFocusButton>();

这是p函数:

void p()
{
    for (int i = 1; i <= 5; i++)
    {
        NonFocusButton aux = new NonFocusButton();
        aux.Font = new System.Drawing.Font("Britannic Bold", 15.75F,    
        System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,   
            ((byte)(0)));
        aux.Size = new System.Drawing.Size(192, 43);
        aux.UseVisualStyleBackColor = true;
        aux.UseWaitCursor = false;
        aux.Visible = false;
        buttons.Add(aux);
        this.Controls.Add(aux);
    }            
    // button start
    buttons[0].Location = new System.Drawing.Point(410, 168);
    buttons[0].Text = "START GAME";
    buttons[0].Click += new System.EventHandler(this.button0_Click);
}
private void button0_Click(object sender, EventArgs e)
{
    this.Close();
}
buttons[0].PerformClick(); // will not work

执行单击自定义按钮将不起作用

如何声明和填充按钮?这就是我拥有它的方式,它有效。

// declaration  
List<Button> butons = new List<Button>();
// calling  
buttons.Add(new Button());  
p();
buttons[0].PerformClick();

编辑:

按钮必须先获得焦点,然后才能单击。
为什么不做这样的事情:

button0_Click(buttons[0], EventArgs.Empty);  

或者只是从您打电话给PerformClick()的任何地方拨打Close()

Button PerformClick源代码是:

public void PerformClick() {
    if (CanSelect) {
        bool validatedControlAllowsFocusChange;
        bool validate = ValidateActiveControl(out validatedControlAllowsFocusChange);
        if (!ValidationCancelled && (validate || validatedControlAllowsFocusChange))
        {
            //Paint in raised state...
            //
            ResetFlagsandPaint();
            OnClick(EventArgs.Empty);
        }
    }
}

CanSelect

public bool CanSelect {
    // We implement this to allow only AxHost to override canSelectCore, but still
    // expose the method publicly
    //
    get {
        return CanSelectCore();
    }
}
internal virtual bool CanSelectCore() {
    if ((controlStyle & ControlStyles.Selectable) != ControlStyles.Selectable) {
        return false;
    }
    for (Control ctl = this; ctl != null; ctl = ctl.parent) {
        if (!ctl.Enabled || !ctl.Visible) {
            return false;
        }
    }
    return true;
}

我对限制的猜测是使用了Selectable标志,而不是添加另一个控制标志,例如AllowsPerformClick

您可以使用反射,而不是使用PerformClick

例如
MethodInfo methodOnClick = typeof(Button).GetMethod("OnClick", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
// and then...
methodOnClick.Invoke(myButton, new Object[] { EventArgs.Empty });
或者

,您可以覆盖PerformClick事件并临时选择按钮以执行事件执行,如下所示:

public new void PerformClick()
{
    SetStyle(ControlStyles.Selectable, true);
    base.PerformClick();
    SetStyle(ControlStyles.Selectable, false);
}

在您的情况下,完整的代码将是:

public class NonFocusButton : Button
{
    public NonFocusButton()
    {
        SetStyle(ControlStyles.Selectable, false);
    }
    public new void PerformClick()
    {
        SetStyle(ControlStyles.Selectable, true);
        base.PerformClick();
        SetStyle(ControlStyles.Selectable, false);
    }
}

这样,您无需对项目的其余部分进行任何其他更改。