动态创建的自定义PictureBox中控件点击事件失效问题排查
问题原因及修复方案
1. FormView强制切回主窗体激活状态,导致控件无法接收事件
在FormView的OnActivated重写方法中,你强制将焦点切回主窗体:
protected override void OnActivated(EventArgs e) { this.BeginInvoke(new Action(() => this.Owner.Activate())); }
这会让FormView永远无法获得激活状态,其上所有控件(包括customPB内的btnLink)都无法响应鼠标点击。
修复:
如果不需要强制保持主窗体激活,直接删除该方法;如果必须保留主窗体激活状态,需设置FormView的ShowWithoutActivation属性为true,同时移除OnActivated的重写:
protected override bool ShowWithoutActivation { get { return true; } }
这样窗体不会抢夺主窗体焦点,但控件仍能接收鼠标事件。
2. 主窗体中FormView实例创建存在错误
主窗体代码里的两处问题:
private FormView frm1 ; public frmMain() { InitializeComponent(); FormView frm1 = new FormView(this); // 局部变量覆盖成员变量,构造函数结束后实例会被销毁 FormView.Visible = true; // 错误访问类属性,应访问实例属性 }
另外FormView的构造函数需要三个参数,原代码传参不完整会编译报错。
修复:
private FormView frm1 ; public frmMain() { InitializeComponent(); // 使用成员变量,补充构造函数所需的位置、大小参数 frm1 = new FormView(this, new Point(0,0), new Size(284,261)); }
(注:FormView构造函数内已调用Show(windowParent),无需额外设置Visible = true)
3. customPB的InitializeComponent存在变量名不一致错误
customPB初始化方法中,声明的按钮变量是btnAmazon,但后续配置和添加控件时用的是btnLink:
this.btnAmazon = new Button(); // ... this.btnLink.BackColor = System.Drawing.Color.White; this.Controls.Add(this.btnLink);
这会导致按钮未被正确创建,编译报错。
修复:
统一变量名,同时在customPB类中声明按钮成员:
private Button btnLink; // 类内添加成员声明 private void InitializeComponent() { this.btnLink = new Button(); ((System.ComponentModel.ISupportInitialize)(this)).BeginInit(); this.SuspendLayout(); // btnLink配置 this.btnLink.BackColor = System.Drawing.Color.White; this.btnLink.BackgroundImage = Properties.Resources.LinkIcon; this.btnLink.Location = new System.Drawing.Point(9, 70); this.btnLink.Name = "btnLink"; this.btnLink.Size = new System.Drawing.Size(34, 34); this.btnLink.TabIndex = 1; this.btnLink.MouseClick += new MouseEventHandler(BtnLink_Click); this.Controls.Add(this.btnLink); this.Size = new System.Drawing.Size(195, 114); ((System.ComponentModel.ISupportInitialize)(this)).EndInit(); this.ResumeLayout(false); }
4. 动态创建customPB时未设置位置(可选优化)
双击创建customPB时未设置位置,控件会重叠在左上角,可能导致点击不到按钮:
private void FormView_MouseDoubleClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { custPB = new customPB(); custPB.Location = e.Location; // 设置为双击位置 this.Controls.Add(custPB); } }
内容的提问来源于stack exchange,提问作者Mehdi
相关产品推荐
相关产品推荐

