假设我有一个创建的Form类和一个CustomControl类。C#手动触发的MouseDown无法触发MouseUp
在我的窗体上我有两个CustomControl实例和一个Panel。 (MouseEnter)(用于指定不同的游标),MouseLeave(用于重置游标),MouseDown(用于启动拖动线程)和MouseUp(用于杀死拖动线程并执行后拖动逻辑)。 )。
我可以将面板拖到CustomControl上。当我这样做时,Form中的代码检测到我做了什么,并从Form.Controls中删除Panel,将一些元信息传递给CustomControl,然后它自己创建一个Panel。
基本上,它是一个交接。 Panel对象现在属于CustomControl。 (这是必要的。这是复杂的,解释为什么,但想象中的自定义控件具有类似滚动条,而对于面板属于CustomControl,使其与CustomControl滚动这是必要的。)
现在,当我点击CustomControl中的面板时,面板的MouseDown被触发,它从CustomControl.Controls中被删除,并发送一些元信息返回到Parent(表单),然后重新创建Panel,因为它是在开始 - 然而已经处于拖动状态,以便用户可以将Panel重新定位到第二个CustomControl上,或者可以将其重新放回到Form上。 Form首次初始化时创建Panel的函数与现在创建它的函数完全相同。
但是,面板的MouseDown没有被触发。鼠标为,但事件未触发,因为鼠标在创建时已关闭。所以,我在Form中的函数中手动调用MouseDown处理函数,该函数接受来自CustomControl的元信息。
不幸的是,这只有一半工作。 MouseUp处理程序未触发。我可以按照预期从CustomControl中取出面板并在窗体上拖动它,但当释放鼠标时,面板将卡在光标上。
我不确定如何解决这个问题?
一个理想的解决办法是,当元信息被传递回形式,是创建新的面板,MouseDown事件以某种方式自然就像用户刚刚点击在面板上的火。
仅仅因为您调用了Mousedown事件,并不意味着面板认为鼠标已被按下。看看实际发送的mousedown窗口消息到面板。 – 2011-04-15 02:53:29