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