如何防止设计模式启用子控件移动到其包含控件之外?

时间:2010-06-30 13:28:14

标签: c# .net vb.net winforms

我有一个UserControl,其中包含我希望能够在设计时重新排列或调整大小的其他控件。所以我有一个继承自System.Windows.Forms.Design.ParentControlDesigner的UserControl的自定义设计器,我从设计器中的子控件上调用EnableDesignMode。这样,在设计时,我可以拖放子控件来移动它们,或者调整它们的大小。但我也可以将子控件拖放到原始UserControl之外的窗体上的其他位置。有没有办法可以限制子控件在UserControl外移动或调整大小?

1 个答案:

答案 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

有点未经考验的想法,当然,我不知道你想要做什么;希望它有效!