Перемещать содержимое формы, когда элемент управления повторно расположен - PullRequest
1 голос
/ 15 мая 2011

Скажем так, у меня есть много элементов управления в моей форме, и когда пользователь нажимает на один из них, его высота увеличивается. Это означает, что в настоящее время, когда этот элемент управления clicked расширяется, другие элементы управления под ним будут перекрываться расширенным элементом управления.

Но я хочу, чтобы каждый элемент управления под расширенным элементом управления скользил вниз, чтобы они снова находились под расширенным элементом управления.

Я знаю, как справляться со скольжением, но я просто не знаю, как сделать каждый элемент управления, кроме одного, каждый раз, когда перемещается данный элемент управления.

Любая помощь очень ценится, спасибо!

Это то, о чем я думал:

void newOrderReceived(object sender, EventArgs e)
{
    foreach(Control OrderNotificationBox in OrdersPanel.Controls)
    {
        if(OrderNotificationBox is NotificationBox) // Checks to see if the control is a NotificationBox
        {
            // Add my code to slide controls down.
        }
    }
}

Но ... Как узнать, находится ли элемент управления на ниже расширенного элемента управления?

Так мне следует изменить расположение всех элементов управления под расширенным элементом управления?

Редактировать: Просто подумал, чтобы проверить, не находится ли NotificationBox ниже расширенного NotificationBox, см. Пересмотренный код ниже:

void newOrderReceived(object sender, EventArgs e)
{
    foreach(Control OrderNotificationBox in OrdersPanel.Controls)
    {
        if(OrderNotificationBox is NotificationBox) // Checks to see if the control is a NotificationBox
        {
            if(OrderNotificationBox.Location.Y <= ExpandedNotificationBox.Location.Y + ExpandedNotificationBox.Size.Width)
            {
                // Add my code to slide controls down.
            }
        }
    }
}

Но будет ли этого достаточно? В настоящее время это работает, так что, я думаю, я просто ответил на свой вопрос. Но разве нет лучшего способа сделать это? Более элегантный / эффективный способ?

Вот пример того, как это должно выглядеть: Expanded Control with properly re-located controls

Ответы [ 3 ]

2 голосов
/ 15 мая 2011

FlowLayoutPanel предоставляет вам динамический макет, где вы можете изменить размер любого элемента управления в нем, и все нижеуказанные элементы управления будут скользить автоматически. Существует множество стратегий использования групп / столбцов панелей макета потока, чтобы можно было получить желаемый вид всей формы. Некоторый поиск в Google покажет некоторые из них.

enter image description here

Например, в приведенной выше форме изменение размера элемента управления button1 просто перетаскивает все нижеуказанные элементы управления в форму вниз. Вы можете попробовать это и во время разработки. Удалите форму панели макета потока, поместите 3-4 элемента управления в контейнер и начните экспериментировать.

1 голос
/ 15 мая 2011

Для каждого расширяемого контента используйте Панель.
Прикрепите свои панели друг к другу (используйте panel1.Dock = DockStyle.Top. Для самой нижней панели используйте panel1.Dock = DockStyle.Fill).
Разместите ваши дочерние элементы управления внутри каждой расширяемой панели, соответственно установите свойства Anchor внутренних элементов управления.
Когда вы раскроете одну панель, остальные панели будут настроены автоматически. Вам не нужно код для этого. Вы будете изменять только Height панели, которую вы в данный момент расширяете.

0 голосов
/ 15 мая 2011

Что вам нужно, так это какая-то функциональность ExplorerBar.Есть несколько управляющих библиотек, которые предлагают это, и я нашел статью здесь на CodeProject , в которой она есть бесплатно.

...