c# 自定义控件将鼠标事件传递到父控件

我写了一个自定义控件myCtrl1,将其放在了Mainform界面上,然后再Mainform界面上给myCtrl1添加了mouseclick事件响应函数myCtrl1_Click(),结果运行时鼠标点击这个myCtrl1控件后,myCtrl1_Click()死活接收不到事件。

后来想到肯定是mouseclick事件被myCtrl1控件内部接收之后没有传到外面。

处理方法:

myCtrl1里面有个label1,

在myCtrl1类内部添加控件label1的mouseclick函数label1Msg_Click(),在函数里添加这行代码:

this.InvokeOnClick(this,null);

这样,在mainform的myCtrl1_Click()函数就能接收到消息了。

### C# 中创建自定义控件并实现事件处理 #### 创建自定义控件 为了在C#中创建自定义控件,可以遵循以下方法: 在一个解决方案中建立两个项目:一个是用于测试的Windows窗体应用程序(例如命名为`TestCustomCtrl`),一个是类库项目(例如命名为`CustomCtrlLib`)。在这个类库项目里构建所有的自定义控件。 移除默认生成的`Class1.cs`文件之后,通过添加一个新的用户控件来启动自定义控件的创建工作。这可以通过右键点击`CustomCtrlLib`项目,选择“添加”,接着选择“新建项”,再从中挑选“用户控件”。完成这些操作后会得到一个空白的用户控件设计界面[^2]。 对于外观上的定制化调整,比如更改背景颜色等基本属性设置可以直接在属性窗口内修改相应选项达成目的。 ```csharp public partial class CustomControl : UserControl { public CustomControl() { InitializeComponent(); this.BackColor = Color.LightBlue; // 设置背景色为浅蓝色 } } ``` #### 实现事件处理 当涉及到向上述创建好的自定义控件添加功能性的交互逻辑时,则需考虑如何有效地管理与响应各种可能发生的事件。下面是一个关于按钮点击事件的例子说明怎样给自定义控件绑定以及触发特定行为的方法。 假设希望每当鼠标单击发生在自定义控件上时执行一段代码片段,可以在设计器文件(`*.Designer.cs`)或者构造函数内部注册相应的事件处理器。 ```csharp // 构造器中订阅 Click 事件 this.Click += new EventHandler(CustomControl_Click); private void CustomControl_Click(object sender, EventArgs e) { MessageBox.Show("您刚刚点击了自定义控件!"); } ``` 如果想要让外部能够监听到这个自定义控件所抛出的某些特殊状态变化或者其他类型的活动,还可以公开新的公共事件供使用者连接自己的回调函数去接收通知。 ```csharp using System.ComponentModel; public partial class CustomControl : UserControl { private int clickCount; /// <summary> /// 当点击次数超过指定阈值时发生。 /// </summary> public event EventHandler<ThresholdReachedEventArgs> ThresholdReached; protected virtual void OnThresholdReached(ThresholdReachedEventArgs e) { ThresholdReached?.Invoke(this, e); } private void CustomControl_Click(object sender, EventArgs e) { ++clickCount; if (clickCount >= thresholdValue) { var args = new ThresholdReachedEventArgs(clickCount); OnThresholdReached(args); } else { MessageBox.Show($"已点击{clickCount}次"); } } } /// 自定义参数传递对象 public class ThresholdReachedEventArgs : CancelEventArgs { public readonly int Count; public ThresholdReachedEventArgs(int count) => Count = count; } ``` 这段代码展示了如何定义一个名为 `ThresholdReached` 的新事件,并且提供了一个配套的数据载体 `ThresholdReachedEventArgs` 来携带额外的信息给任何对该事件感兴趣的组件实例。一旦检测到满足条件的情况就会调用 `OnThresholdReached()` 方法从而激活所有已经绑定了此事件的对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GreenHandBruce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值