Skip to content

Выполнение операций закрепления в коде

В этой теме описываются операции с панелями закрепления в коде.

Создание панелей закрепления

Вы можете создавать объекты DockPane и DocumentPane с помощью их конструкторов. После создания панели обычно требуется отобразить её в определённой позиции относительно другой панели или контейнера (группы). Метод DockManager.Dock позволяет закрепить панель вдоль края другой панели, добавить панель в существующий контейнер и объединить панели в интерфейсе с вкладками. Чтобы добавить панель как дочерний элемент существующего контейнера, вы также можете использовать метод Add контейнера.

Наиболее часто используемая перегрузка метода DockManager.Dock определена следующим образом:

public bool Dock(DockItemBase item, DockItemBase target, DockType dockType)

Параметр target определяет панель или контейнер, относительно которого закрепляется исходный элемент (переданный как параметр item).

Параметр dockType определяет способ закрепления элемента относительно целевого элемента:

  • DockType.Fill — Исходная и целевая панели объединяются в контейнер вкладок (TabGroup). Если целевая панель уже принадлежит контейнеру вкладок, исходная панель добавляется в этот контейнер; дополнительный контейнер вкладок не создаётся.

  • DockType.Left, DockType.Right, DockType.Top, DockType.Bottom — Исходный элемент закрепления докируется у соответствующей стороны целевого элемента закрепления. При необходимости метод DockManager.Dock создаёт дополнительный контейнер разделения (DockGroup) по горизонтали или вертикали, как описано ниже.

Предположим, вы закрепляете исходную панель сверху или снизу целевой панели, которая принадлежит вертикальному контейнеру разделения.

dockManager1.Dock(paneProperties, paneDebug, DockType.Top);

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

docking-dock-verticalcontainer-dock-to-top

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

dockManager1.Dock(paneProperties, paneDebug, DockType.Left);

docking-dock-verticalcontainer-dock-to-left

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

dockManager1.Dock(paneProperties, paneOutput, DockType.Right);

docking-dock-horizontalcontainer-dock-to-right

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

dockManager1.Dock(paneProperties, paneOutput, DockType.Bottom);

docking-dock-horizontalcontainer-dock-to-bottom

Используйте свойства DockPane.DockWidth и DockPane.DockHeight, чтобы задать размер панелей, когда они размещены в контейнере разделения.

Пример - Создание и отображение панелей рядом

Следующий код создаёт объекты DockPane и DocumentPane и располагает их, как показано на изображении ниже. Объекты DocumentPane помещаются в контейнер DocumentGroup, чтобы представить их в виде вкладок.

docking-code-behind-create-panels

DockPane paneProperties = new DockPane()
{
    Header = "Properties",
    Glyph = ImageLoader.LoadSvgImage(Assembly.GetExecutingAssembly(), "Images/settings.svg"),
    GlyphSize = new Avalonia.Size(16, 16)
};
DockPane paneDebug = new DockPane()
{
    Header = "Debug",
    Glyph = ImageLoader.LoadSvgImage(Assembly.GetExecutingAssembly(), "Images/debug2.svg"),
    GlyphSize = new Avalonia.Size(16, 16)
};
DockPane paneOutput = new DockPane() { Header = "Output" };

dockManager1.Root = new DockGroup();
dockManager1.Dock(paneProperties, dockManager1.Root, DockType.Right);
paneProperties.DockWidth = new GridLength(150, GridUnitType.Pixel);

dockManager1.Dock(paneOutput, paneProperties, DockType.Left);
dockManager1.Dock(paneDebug, paneOutput, DockType.Bottom);
paneDebug.DockHeight = new GridLength(150, GridUnitType.Pixel);

См. также:

Другие примеры:

Доступ к родителю и дочерним элементам элемента закрепления

Свойство DockPane.DockParent позволяет получить непосредственного родителя любого элемента закрепления (панели или контейнера). Например, когда панель находится в контейнере разделения (DockGroup), DockPane.DockParent возвращает этот контейнер разделения. Для панелей, объединённых в контейнере вкладок, DockPane.DockParent возвращает этот родительский контейнер вкладок (объект TabbedGroup или DocumentGroup).

Чтобы получить непосредственные дочерние элементы контейнера закрепления, используйте его свойство Items.

См. также: Доступ к панелям и контейнерам закрепления.

Пример - Доступ к родителю и установка его размера

Следующий код создаёт интерфейс закрепления, состоящий из трёх панелей. В примере задаётся относительная ширина для панели 'Properties' и контейнера вертикального разделения, объединяющего панели 'Output' и 'Debug'.

docking-code-behind-access-parent-and-resize

DockPane paneProperties = new DockPane() { Header = "Properties" };
DockPane paneDebug = new DockPane() { Header = "Debug" };
DockPane paneOutput = new DockPane() { Header = "Output" };

dockManager1.Root = new DockGroup();
dockManager1.Root.Add(paneProperties);
dockManager1.Dock(paneDebug, paneProperties, DockType.Right);
dockManager1.Dock(paneOutput, paneDebug, DockType.Top);
paneProperties.DockWidth = new GridLength(1, GridUnitType.Star);
paneDebug.DockParent.DockWidth = new GridLength(2, GridUnitType.Star);

Закрытие панелей

Метод DockManager.Close позволяет временно скрыть панель или контейнер. Этот метод вызывается, когда пользователь закрывает панель, нажимая кнопку 'Закрыть' ('x').

docking-dockpane-closebutton

При вызове для контейнера (группы) метод Close скрывает все панели этого контейнера.

К закрытым панелям можно получить доступ из коллекции DockManager.ClosedPanes.

Используйте свойство DockPane.AllowClose, чтобы скрыть кнопку 'Закрыть' для панели и, таким образом, предотвратить закрытие панели с помощью этой кнопки. Эта опция не предотвращает закрытие панели с помощью метода DockManager.Close.

При закрытии панели активируется команда DockPane.CloseCommand.

Удаление панелей

Вы можете использовать метод DockManager.Remove для удаления панели из DockManager. Этот метод не освобождает ресурсы панели и её содержимого.

DockManager не хранит ссылки на удалённые панели.

Объединение панелей в контейнере вкладок

Вы можете объединять панели в контейнере вкладок (TabGroup). Для этой цели используйте следующую перегрузку метода DockManager.Dock:

public bool Dock(DockItemBase item, DockItemBase target, DockType dockType)

Параметр target может быть панелью или существующим контейнером вкладок.

Параметр dockType определяет способ закрепления панели. Установите этот параметр в DockType.Fill, чтобы объединить панели в интерфейсе с вкладками.

Когда вы закрепляете объект DockPane в другом объекте DockPane, создаётся контейнер TabGroup. Контейнер DocumentGroup создаётся, когда вы закрепляете DocumentPane в другом объекте DocumentPane.

Вы также можете использовать метод Add контейнера вкладок, чтобы добавить новый элемент в качестве вкладки.

Пример - Создание контейнера вкладок

Следующий код использует метод DockManager.Dock для создания контейнера вкладок из двух панелей.

docking-code-behind-create-tab-container

dockManager1.Root = new DockGroup();
DockPane paneDebug = new DockPane() 
{ 
    Header = "Debug", 
    DockWidth = new GridLength(250, GridUnitType.Pixel) 
};
dockManager1.Root.Add(paneDebug);
DockPane paneOutput = new DockPane() { Header = "Output" };
dockManager1.Dock(paneOutput, paneDebug, DockType.Fill);

Доступ к контейнеру вкладок

Чтобы получить родительский контейнер вкладок для панели, используйте свойство DockParent панели.

См. также: Доступ к панелям и контейнерам закрепления.

Управление автоматически скрываемыми панелями

Автоматически скрываемые панели изначально свёрнуты. Пользователь может нажать кнопку панели, чтобы развернуть её.

docking-code-behind-create-autohide-panel.gif

Создание автоматически скрываемой панели

Используйте метод DockManager.AutoHide, чтобы включить функциональность автоматического скрытия для панели в коде. Этот метод скрывает панель в её текущей или предыдущей позиции закрепления.

dockManager1.AutoHide(paneOutput);

Когда панель собирается стать автоматически скрываемой, создаётся контейнер AutoHideGroup, и панель перемещается в этот контейнер.

Вы можете вызвать метод DockManager.AutoHide для контейнера TabGroup. В этом случае все панели контейнера вкладок становятся автоматически скрываемыми.

Пример - Автоматическое скрытие контейнеров вкладок

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

docking-code-behind-autohide-two-tab-containers

dockManager1.Root = new DockGroup();
dockManager1.Root.Add(new DocumentGroup());
DockPane paneDebug = new DockPane() { Header = "Debug" };
dockManager1.Root.Add(paneDebug);
DockPane paneOutput = new DockPane() { Header = "Output" };
// Create a tab container that combines the 'Debug' and 'Output' panels
dockManager1.Dock(paneOutput, paneDebug, DockType.Fill);

DockPane paneTasks = new DockPane() { Header = "Tasks" };
dockManager1.Root.Add(paneTasks);
DockPane paneExplorer = new DockPane() { Header = "Explorer" };
//Create a tab container that combines the 'Tasks' and 'Explorer' panels
dockManager1.Dock(paneExplorer, paneTasks, DockType.Fill);

//Auto-hide the tab containers
dockManager1.AutoHide(paneDebug.DockParent);
dockManager1.AutoHide(paneTasks.DockParent);

Восстановление панели из автоматически скрытого состояния

Используйте перегрузку метода DockManager.Dock(DockItemBase item), чтобы восстановить панель из автоматически скрытого состояния в её предыдущую позицию закрепления.

dockManager1.Dock(paneOutput);

Вы также можете использовать перегрузку Dock(DockItemBase item, DockItemBase target, DockType dockType), чтобы восстановить автоматически скрытую панель, одновременно перемещая её в определённую позицию в макете.

dockManager1.Dock(paneOutput, paneDebug, DockType.Right););

Отображение и свёртывание автоматически скрываемой панели

Методы DockManager.ExpandAutoHidePanel и DockManager.CollapseAutoHidePanel позволяют отображать и сворачивать автоматически скрываемую панель. Свойство DockPane.IsActive позволяет сфокусироваться на любой панели. Для автоматически скрываемой панели это свойство разворачивает панель (если она свёрнута), а затем фокусируется на ней.

Доступ к автоматически скрываемым панелям

Вы можете использовать коллекцию DockManager.AutoHideGroups для доступа ко всем существующим контейнерам AutoHideGroup. Свойство AutoHideGroup.Items позволяет получить все автоматически скрываемые панели, отображаемые в конкретном контейнере.

Чтобы получить родительский контейнер для автоматически скрываемой панели, см. свойство DockPane.AutoHideGroup.

См. также: Доступ к панелям и контейнерам закрепления.

Управление плавающими панелями

Создание плавающих панелей

Используйте метод DockManager.Float, чтобы сделать панель плавающей в коде. Когда вы делаете панель плавающей, она перемещается в контейнер FloatGroup (плавающее окно). Свойство DockPane.FloatGroup плавающей панели позволяет получить доступ к родительскому плавающему окну и задать его границы (см. FloatGroup.FloatLocation, FloatGroup.FloatWidth и FloatGroup.FloatHeight).

docking-code-behind-create-floating-panel

DockPane paneTasks = new DockPane() { Header = "Tasks" };
dockManager1.Float(paneTasks);
// Set the floating window's bounds
paneTasks.FloatGroup.FloatLocation = new Avalonia.PixelPoint(200, 200);
paneTasks.FloatGroup.FloatWidth = 300;
paneTasks.FloatGroup.FloatHeight = 200;

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

docking-code-behind-floating-split-container

DockPane paneTasks = new DockPane() { Header = "Tasks" };
dockManager1.Float(paneTasks);
DockPane paneExplorer = new DockPane() { Header = "Explorer" };
dockManager1.Dock(paneExplorer, paneTasks, DockType.Right);

Доступ к плавающим панелям

Коллекция DockManager.FloatGroups позволяет получить существующие плавающие окна (объекты FloatGroup). Используйте свойство FloatGroup.Items, чтобы получить список панелей, отображаемых в каждом плавающем окне.

См. также: Доступ к панелям и контейнерам закрепления.

Доступ к панелям и контейнерам закрепления

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

  • Метод расширения GetItems DockManager — Возвращает линейный список всех закреплённых, автоматически скрываемых и закрытых панелей и групп.
  • Метод расширения FindItem DockManager — Возвращает элемент по имени.
  • DockGroup.Items — Получает список непосредственных дочерних элементов контейнера.
  • DockPane.DockParent — Получает непосредственного родителя элемента закрепления.
  • DockPane.FloatGroup — Возвращает плавающее окно, в котором находится панель в плавающем состоянии.
  • DockPane.AutoHideGroup — Возвращает контейнер AutoHideGroup, в котором находится панель в автоматически скрытом состоянии.
  • DockManager.Root — Возвращает корневую группу (контейнер), которая отображает все закреплённые панели и контейнеры.
  • DockManager.FloatGroups — Получает коллекцию существующих объектов FloatGroup (плавающих окон).
  • DockManager.AutoHideGroups — Получает коллекцию существующих объектов AutoHideGroup.
  • DockManager.ClosedPanes — Возвращает коллекцию закрытых панелей.

Управление операциями закрепления

Если вам требуется гибкий контроль над операциями закрепления, выполняемыми пользователями, вы можете обрабатывать следующие события:

  • DockManager.DockOperationStarting — Срабатывает, когда операция закрепления вот-вот начнётся.
  • DockManager.DockOperationCompleted — Срабатывает после завершения операции закрепления.
  • DockManager.DockItemActivated — Срабатывает после активации элемента закрепления.
  • DockManager.DockItemStartFloatDragging — Срабатывает, когда панель становится плавающей или плавающее окно вот-вот будет перемещено.
  • DockManager.DockItemEndFloatDragging — Срабатывает после завершения перетаскивания плавающего окна.

Пример - Запрет закрытия панели

Следующий обработчик события DockManager.DockOperationStarting не позволяет закрыть панель 'Output', когда пользователь нажимает кнопку 'Закрыть' ('x') панели.

private void DockManager1_DockOperationStarting(object? sender, DockOperationStartingEventArgs e)
{
    if(e.Item is DockPane pane)
    {
        e.Cancel = e.DockOperation == DockOperation.Close && pane.Header == "Output";
    }

}



* Эта страница была переведена с помощью нейросети Deepseek.