Как предотвратить перемещение дочернего элемента управления в режиме конструктора за пределы содержащего его элемента управления? - PullRequest
1 голос
/ 30 июня 2010

У меня есть UserControl, который содержит другие элементы управления, которые я хотел бы изменить или изменить во время разработки.Поэтому у меня есть пользовательский конструктор для UserControl, который наследуется от System.Windows.Forms.Design.ParentControlDesigner, и я вызываю EnableDesignMode на дочерних элементах управления из конструктора.Таким образом, во время разработки я могу перетащить дочерние элементы управления, чтобы переместить их или изменить их размер.Но я также могу перетащить дочерние элементы управления в другое место на форме, которая находится за пределами исходного UserControl.Есть ли способ, которым я могу ограничить перемещение или изменение размера дочерних элементов управления за пределы UserControl?

1 Ответ

0 голосов
/ 30 июня 2010

Когда вы обнаружите, что дочерний элемент управления добавляется в ваш пользовательский элемент управления, добавьте обработчик к его родительскому событию (вы также захотите добавить его в своего рода список, чтобы вы могли избежать добавления нескольких обработчиков просто для безопасности) , затем, если родительский объект снова изменяется, проверьте родительское свойство элемента управления, инициирующего событие (и зациклите родительскую цепочку, если она находится в контейнере с вашим пользовательским элементом управления) - если вы не нашли себя, выдайте ошибку snide сообщение типа «Я завидую контролю, которому не нравится, когда мои дети выходят из-под моего контроля».

В вашем пользовательском контроле (простите за полупсуедуокод, я делаю весь этот ответ во время копирования файла: -)

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

Вид непроверенной идеи, конечно, я понятия не имею, что вы пытаетесь сделать; надеюсь, что это работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...