我有一个UserControl,其中包含我希望能够在设计时重新排列或调整大小的其他控件。所以我有一个继承自System.Windows.Forms.Design.ParentControlDesigner
的UserControl的自定义设计器,我从设计器中的子控件上调用EnableDesignMode
。这样,在设计时,我可以拖放子控件来移动它们,或者调整它们的大小。但我也可以将子控件拖放到原始UserControl之外的窗体上的其他位置。有没有办法可以限制子控件在UserControl外移动或调整大小?
答案 0 :(得分:0)
当您检测到添加到自定义控件的子控件时,请在其parentchanged事件中添加一个处理程序(您还希望在控件中添加某种列表,这样您就可以避免添加多个处理程序以保证安全) 。然后,如果父级再次更改,请检查触发事件的控件的父属性(并循环父链,以防它在自定义控件中的容器中) - 如果您没有找到自己,则抛出一个snide错误像“我是一个嫉妒的控制者,不喜欢我的孩子被移出我的监督”这样的信息。
在你的usercontrol中(原谅半假代码,我在文件复制期间做了这整个答案: - )
dim ControlsProcessed as List (of Control)
sub OnControlAdded(sender as obj...) handles MyBase.ControlAdded
if not in design mode, exit sub
dim ctl as control = ctype(sender,control)
if ControlsProcessed.Contains(ctl) then exit sub
ControlsProcessed.Add(ctl)
addhandler ctl.ControlAdded,addressof (OnControlAdded) ' So you can monitor containers within yourself
addhandler ctl.ParentChanged, addressof(OnParentChanged)
end sub
sub OnParentChanged(sender as object, e as ....)
dim ctl as control = ctype(sender,control)
dim pctl as control = ctl.parent
while pctl isnot nothing
if pctl is me then exit sub
[ if you want to allow moving to others of your kind: if typeof pctl is (mytype) then exit sub]
wend
Throw now applicationexception ("You sneaky devil you can't do that!")
End Sub
有点未经考验的想法,当然,我不知道你想要做什么;希望它有效!