C#怎样在代码中引发事件
我自定义一个按钮类, 里面用public 方法 内部调用 OnMouseDown 和OnMouseUp. 然后在窗体中调用按钮的public方法. 的确是引发了事件, 按钮按下动画问题也用多线程解决了 展开
你这做法钻了牛角尖,你这就好比把用火车拉摩托,骑在摩托车上要实现火车的效果.
要么就直接坐火车,要么就直接改装摩托车.
动画有问题你就自己画一个按钮嘛,控制他按下和弹起的效果不就行了.是要模拟他的事件,那就是简单给他一个视觉效果,事件在你触发的动作里完成,还真的去给按钮完成吗?微软的人不会傻到这种程度,做一个没有意义的事情拐弯抹角,让你用按钮不触发去体现触发效果.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);
}
}
}
2014-07-17
我不是要自定义事件, 我是想不用鼠标之类的, 来引发事件, 比如代码中引发按钮单击事件,就是不用鼠标按,按钮能显示被按下去了.
那你看看有没有keyborder 按下事件
那你就直接触发鼠标,或者发送键盘键值啊。
最容易的就是给按钮设置焦点或者将按钮设置为默认按钮,然后SendKeys发送Enter键就ok了。
事件可以引发的, 比如自定义事件, 向方法一样执行就好(委托就可以直接执行.), 但这些控件啊, 窗体啊,它们的事件就提示不能引发, 只能注册处理程序. 只能通过鼠标之类的来引发事件. 正常应该可以通过 SendMessage来引发吧? 但如果和自定义事件一件,应该可以直接引发才对啊,还有其它手段吗?
事件的过程是:硬件触发->硬件驱动检测(获取处理参数)->.NETFramewor拦截到事件,然后注册到botton的click等事件中(参数也传递)->通过委托来执行事件(botton_click(sender,e));
这个过程是简化版的事件处理过程,其实就是逐步委托的过程。然后考虑下你的要求吧。