问题描述
|
假设我已经创建了一个Form类和一个CustomControl类。
在我的表单上,我有两个CustomControl实例和一个Panel。
Panel具有4个事件处理程序:MouseEnter(用于提供不同的光标),MouseLeave(用于重置光标),MouseDown(用于启动拖动线程)和MouseUp(用于终止拖动线程并执行拖动后逻辑)。
我可以将面板拖到CustomControl上。当我这样做时,Form中的代码会检测到我所做的事情,并从Form.Controls中删除Panel,将一些元信息传递给CustomControl,CustomControl然后在其自身上创建一个Panel。
基本上,这是移交。现在,Panel对象属于CustomControl。
(这是必要的。解释原因很复杂,但是可以想象自定义控件具有类似滚动条的功能,并且面板必须属于CustomControl,以便它与CustomControl一起滚动。)
现在,当我在CustomControl上单击Panel时,Panel的MouseDown被触发,它将从CustomControl.Controls中删除,并将一些元信息发送回Parent(窗体),然后重新创建Parent面板一开始就处于面板状态-但是已经处于拖动状态,以便用户可以将面板重新放置到第二个CustomControl上,或者将其放回到窗体上。第一次初始化表单时创建面板的功能与现在创建面板的功能完全相同。
但是,尚未触发面板的MouseDown。鼠标处于按下状态,但事件未触发,因为创建鼠标时鼠标已处于按下状态。因此,我在Form函数中手动调用MouseDown处理程序,该函数接受CustomControl的元信息。
不幸的是,这只能成功一半。 MouseUp处理程序未触发。我可以从CustomControl上拿起Panel,然后按预期在窗体上拖动它,但是当我释放鼠标时,Panel会卡在光标上。
我不太确定该如何解决?
理想的解决方案是,当将元信息传递回Form并创建新的Panel时,MouseDown事件以某种方式自然触发,就像用户刚刚单击Panel一样。
解决方法
听起来好像您是在将Panel从CustomControl移到Form并返回并失去其状态时正在创建一个Panel的新实例。
您应该尝试将Form拥有的实际实例传递给CustomControl而不创建新实例,或者可以在另一个对象中捕获Panel的状态,然后在创建新Panel时将其传递给构造函数,以便它位于与您拖动的状态相同?
似乎您正在尝试手动触发鼠标事件以补偿设计中的问题。
如果可以的话,总是比给出冗长的文字说明更好。
,看这个
自定义控件的即时信息在外部单击时消失
我有像你这样的问题。
您不应使用局部变量来处理mouseEvent。
尝试使用“捕获”功能。对我来说是工作。