执行单击自定义按钮将不起作用
本文关键字:不起作用 按钮 自定义 单击 执行 | 更新日期: 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);
}
}
这样,您无需对项目的其余部分进行任何其他更改。