Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 158 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 16:

Динамическая компоновка формы

Панели и контейнеры

Все потомки класса Control наследуют от него свойство Controls, в котором можно хранить ссылки на дочерние элементы управления. Иными словами, любой элемент управления способен быть контейнером других элементов. Но обычно в качестве контейнеров выступают такие элементы, как формы и панели. Именно они компонуют пользовательский интерфейс.

Далее рассмотрим избранную иерархию классов, связанную с решением задачи динамического размещения элементов интерфейса:


Стыковка дочерних элементов (свойство Dock)

Стыковка элементов управления в клиентской области родителя обеспечивается значением их свойства Dock, которое ожидает одно из значений перечисления System.Windows.Forms.DockStyle:

Таблица 16.1 . Значения перечисления DockStyle
None = 0 Нестыкуемая (по умолчанию)
Top = 1 Пристыковать сверху
Bottom = 2 Пристыковать снизу
Left = 3 Пристыковать слева
Right = 4 Пристыковать справа
Fill = 5 Развернуть на всю клиентскую область

Если контейнер содержит несколько элементов управления и если в одном из них свойству Dock присвоено значение, отличное от None, то и другим элементам нужно присвоить отличное от None значение. И только один элемент может иметь значение Fill. Иначе элементы будут перекрываться.

Дочерние элементы в контейнере выстраиваются в Z -последовательность в порядке их добавления в контейнер с помощью свойства Parent самого элемента управления или методом Controls.Add() контейнера. В таком же порядке они и отображаются. Изменить место элемента в Z -последовательности можно методами BringToFront() и SendToBack(). Если элементы Z -последовательности перекрываются, то элемент с меньшим индексом будет располагаться сверху.

Если элементы пристыковываются к одному краю контейнера, то каждый новый добавленный в контейнер элемент будет пристыковываться непосредственно к краю, оттесняя к центру клиентской области контейнера ранее пристыкованные к этому краю элементы. Поэтому вначале нужно дабавить к контейнеру элемент с параметром Dock=Fill, а потом пристыковывать элементы к краям родителя.

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

using System;
using System.Drawing;
using System.Windows.Forms;
    
namespace Test
{
    // Класс приложения
    class MyClass : Form
    {
        public MyClass()
        {
            this.Text = "Схематичный Блокнот";
    
            // Создаем многострочный TextBox
            TextBox textBox = new TextBox();
            textBox.Parent = this;
            textBox.Multiline = true;
            textBox.Dock = DockStyle.Fill;// Добавляется первым
    
            // Создаем объект дерева
            TreeView tree = new TreeView();
            tree.Parent = this;// Один способ
            tree.Dock = DockStyle.Left;// Оттесняет первого слева
            tree.Nodes.Add("tree");// Добавили узел
    
            // Создаем панель инструментов
            ToolStrip tool = new ToolStrip();
            this.Controls.Add(tool);// Другой способ
            tool.Items.Add("tool");// Оттесняет другие сверху
               
            // Создаем меню
            MenuStrip menu = new MenuStrip();
            this.Controls.Add(menu);// Другой способ
            menu.Items.Add("menu");// Оттесняет другие сверху
    
            // Создаем панель состояния
            StatusStrip status = new StatusStrip();
            status.Parent = this;// Один способ
            status.Items.Add("status");// Оттесняет другие снизу
        }
    }
    
    // Запуск
    class Program
    {
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new MyClass());
        }
    }
}
Листинг 16.3 . Иллюстрация порядка размещения элементов

Результат выполнения такой


Красными цифрами показаны индексы элементов в коллекции Form.Controls, соответствующие порядку их добавления. Если в коде изменить порядок добавления элементов управления в контейнер формы, то размещение элементов станет другим.

Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.

 

Как активировать код?