C#怎样在代码中引发事件

非自定义事件,而是引发如按钮单击\窗体单击之类的事件,注意是问如何引发事件,不是调用事件处理代码.是不是要用SendMessage呢,如果是具体怎样写?还有没有其它方法?... 非自定义事件, 而是引发如按钮单击\ 窗体单击之类的事件, 注意是问如何引发事件, 不是调用事件处理代码. 是不是要用SendMessage呢, 如果是具体怎样写? 还有没有其它方法? 谢谢
我自定义一个按钮类, 里面用public 方法 内部调用 OnMouseDown 和OnMouseUp. 然后在窗体中调用按钮的public方法. 的确是引发了事件, 按钮按下动画问题也用多线程解决了
展开
 我来答
创作者zUzVB1Sl31
2014-07-18 · 编程类资料、英语学习资料
创作者zUzVB1Sl31
采纳数:1331 获赞数:5975

向TA提问 私信TA
展开全部

你这做法钻了牛角尖,你这就好比把用火车拉摩托,骑在摩托车上要实现火车的效果.

要么就直接坐火车,要么就直接改装摩托车.

动画有问题你就自己画一个按钮嘛,控制他按下和弹起的效果不就行了.是要模拟他的事件,那就是简单给他一个视觉效果,事件在你触发的动作里完成,还真的去给按钮完成吗?微软的人不会傻到这种程度,做一个没有意义的事情拐弯抹角,让你用按钮不触发去体现触发效果.SendMessage方法是捕捉当前窗口句柄消息的,C#有一种办法叫委托事件,接近你的想法,很多人对这个概念相当迷糊,我简单举个例子,现在我要给某个控件创建一个事件类型,创建了事件类型再去给事件类型事件过程,前后我做的事是:

  创建某个控件事件类型赋予他定义---->创建方法体(事件宏):

//定义一个委托类型
public delegate void Substents(object sender, EventArgs e);
//定义一个事件
public event Substents UserClick;
//委托事件,事件当作参数
private void 控件名称_Click(object sender, EventArgs e)
{
   if (UserClick != null)UserClick(sender, new EventArgs());
}

现在用户就可以这样加事件过程:

void demo()
{
   //这里写你的事件操作过程
}
UserClick+=new EventHandler(demo);

这就是托管,什么带参数的方法作为方法的参数,这么绕口的话是大部分人为了炫耀自己的学识误人误己的解释,他实际上就是把方法当成了系统委托事件的变量,delegete是系统托管类型,不要在上面纠结太多,怎么定义这个类型是微软做好的事情.有本事大家再写个类型替代他

更多追问追答
追问
自定义事件我知道怎么使用的, 简单点说,我昨天只是为了找到触发控件事件的方法(代码触发), 后来找到了,就是 OnXXX , 但是后来使用这个引发了控件的事件, 也执行了事件的处理代码,但是动画显示有点问题,所以又追问了下. 看具体是什么地方出问题.
追答

代码贴出来看一下,我不知道从哪下手,我的天,On方法不就是指定控件方法吗?我指定的是实体罢了,控件名称_Click这难道不是一个on方法,.NET用的就是On方法,你也可以这么写:

protected virtual void OnUserClick(EventArgs e)
{
   if (UserClick != null)UserClick(this,e);
}

好了现在Event类型的变量都可以触发事件(当然用户事件类型你可以自己定义,定义的先示例化一下就好了)

 OnUserClick(e);

这个不难理解,就好比我在窗体的按钮button1中写代码,要求整个窗体中按钮做一样的事情

private void button1_Click(object sender, EventArgs e)
{
   //....做了某事情

private void button2_Click(object sender, EventArgs e)
{
   foreach(Control ctl in this.Controls)
   {
      if(ctl is Button)
      {
         button1_Click(sender,e);
      }
   }
}
微测检测5.10
2023-05-10 广告
您好!建议咨 深圳市微测检测有限公司,已建立起十余个专业实验室,企业通过微测检测就可以获得一站式的测试与认 证解决方案;(EMC、RF、MFi、BQB、QI、USB、安全、锂电池、快充、汽车电子EMC、汽车手机互 联、语音通话质量),认证遇... 点击进入详情页
本回答由微测检测5.10提供
匿名用户
2014-07-17
展开全部
如果是窗体的话 自定义事件可以写在Form1.designer.cs 里面写 Form1_load事件什么的都在那里面写 就行了
更多追问追答
追问
我不是要自定义事件, 我是想不用鼠标之类的, 来引发事件,  比如代码中引发按钮单击事件,就是不用鼠标按,按钮能显示被按下去了.
追答
那你看看有没有keyborder 按下事件
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
迅捷训勤航敢7t
2014-07-18 · TA获得超过131个赞
知道答主
回答量:36
采纳率:0%
帮助的人:18.9万
展开全部
看你的意思主要是想要一个按钮事件触发的时候,可以有按钮被按下的动画。
那你就直接触发鼠标,或者发送键盘键值啊。
最容易的就是给按钮设置焦点或者将按钮设置为默认按钮,然后SendKeys发送Enter键就ok了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
喜剧comic
2014-07-17 · TA获得超过103个赞
知道小有建树答主
回答量:148
采纳率:0%
帮助的人:79.9万
展开全部
事件本来就是一个委托,是被动执行的。
追问
事件可以引发的,  比如自定义事件, 向方法一样执行就好(委托就可以直接执行.), 但这些控件啊, 窗体啊,它们的事件就提示不能引发, 只能注册处理程序.  只能通过鼠标之类的来引发事件.   正常应该可以通过 SendMessage来引发吧?  但如果和自定义事件一件,应该可以直接引发才对啊,还有其它手段吗?
追答
事件的过程是:硬件触发->硬件驱动检测(获取处理参数)->.NETFramewor拦截到事件,然后注册到botton的click等事件中(参数也传递)->通过委托来执行事件(botton_click(sender,e));
这个过程是简化版的事件处理过程,其实就是逐步委托的过程。然后考虑下你的要求吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式