Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 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. Ввожу код на сайте, пишет:

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

 

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

Денис Пашков
Денис Пашков
Россия
Татьяна Ковалюк
Татьяна Ковалюк
Украина, Киев, Киевский политехнический институт, 1974