Начало работы с Docking¶
Это руководство показывает, как с нуля настроить макет док-панелей, показанный на изображении ниже. Сначала мы создадим макет закрепленных панелей, а затем покажем, как определить автоматически скрываемые и плавающие панели.
Этот пример демонстрирует элементы докинга, составляющие Docking UI:
-
Dock-панель (
DockPane
) — Панель, которую можно закреплять, переводить в плавающий режим, автоматически скрывать и объединять в группу с вкладками (контейнер). -
Document-панель (
DocumentPane
) — Контейнер для основного содержимого вашего окна. Вы можете использовать Document-панели для реализации интерфейса с вкладками (MDI - Multiple Document Interface).
Для построения макета закрепленных панелей, показанного выше, отдельные панели необходимо объединить в группы (контейнеры). Контейнеры определяют режим отображения и поведение своих дочерних элементов. Вы можете агрегировать контейнеры в других контейнерах для создания сложных макетов панелей.
Библиотека Docking поддерживает следующие контейнеры:
DockGroup
(разделяемый контейнер) — Отображает элементы докинга (Dock-панели и контейнеры) рядом друг с другом, горизонтально или вертикально. Дочерние элементы докинга разделены разделителями, которые позволяют изменять размер панелей.TabbedGroup
(контейнер с вкладками) — Отображает Dock-панели в виде вкладок.DocumentGroup
(контейнер с вкладками) — Отображает Document-панели в виде вкладок.AutoHideGroup
— Дочерние Dock-панели этого контейнера обладают функцией автоматического скрытия. Автоматически скрытая панель появляется, когда пользователь нажимает на заголовок панели.FloatGroup
— Отображает элементы докинга в плавающем окне.
1. Создание компонента DockManager¶
Создайте новое приложение Avalonia UI с контролами Eremex.
Откройте файл MainWindow.axaml и определите компонент DockManager
в XAML.
xmlns:mxd="https://schemas.eremexcontrols.net/avalonia/docking"
<mxd:DockManager>
</mxd:DockManager>
DockManager
— это контрол, который управляет созданием элементов докинга (Dock-панелей и Document-панелей), поддерживает операции с элементами докинга во время выполнения, предоставляет контекстные меню и выполняет сериализацию и десериализацию Docking UI.
2. Определение корневой группы¶
Добавьте объект DockGroup
как дочерний элемент контрола DockManager
. Этот объект используется для инициализации корневой док-группы (свойства DockManager.Root
, которое помечено атрибутом ContentAttribute
).
xmlns:mxd="https://schemas.eremexcontrols.net/avalonia/docking"
<mxd:DockManager>
<mxd:DockGroup>
</mxd:DockGroup>
</mxd:DockManager>
Корневая док-группа — это контейнер для всех панелей и документов в закрепленном состоянии.
3. Добавление панелей 'Properties' и 'Debug'¶
Добавьте объекты DockPane
'Properties' и 'Debug' в корневую группу.
xmlns:mxd="https://schemas.eremexcontrols.net/avalonia/docking"
<mxd:DockManager>
<mxd:DockGroup>
<mxd:DockPane Header="Properties"/>
<mxd:DockPane Header="Debug"/>
</mxd:DockGroup>
</mxd:DockManager>
Контейнер DockGroup
по умолчанию располагает панели горизонтально. Вы можете изменить направление на вертикальное с помощью свойства DockGroup.Orientation
.
4. Объединение панелей в контейнер с вкладками¶
Оберните панели 'Properties' и 'Debug' в контейнер TabbedGroup
. Этот контейнер представляет свои дочерние элементы в виде вкладок.
xmlns:mxd="https://schemas.eremexcontrols.net/avalonia/docking"
<mxd:DockManager>
<mxd:DockGroup>
<mxd:TabbedGroup>
<mxd:DockPane Header="Properties"/>
<mxd:DockPane Header="Debug"/>
</mxd:TabbedGroup>
</mxd:DockGroup>
</mxd:DockManager>
5. Добавление панели 'Error List'¶
Определите панель 'Error List' перед объектом TabbedGroup
.
xmlns:mxd="https://schemas.eremexcontrols.net/avalonia/docking"
<mxd:DockManager>
<mxd:DockGroup>
<mxd:DockPane Header="Error List"/>
<mxd:TabbedGroup>
<mxd:DockPane Header="Properties"/>
<mxd:DockPane Header="Debug"/>
</mxd:TabbedGroup>
</mxd:DockGroup>
</mxd:DockManager>
Контейнер DockGroup
располагает панель 'Error List' и TabbedGroup
в горизонтальном направлении.
6. Добавление группы документов над панелью 'Error List'¶
Чтобы отобразить DocumentGroup
в верхней части панели 'Error List', сначала создайте новый контейнер DockGroup
с вертикальной ориентацией. Затем поместите панель 'Error List' и новый объект DocumentGroup
в этот контейнер.
xmlns:mxd="https://schemas.eremexcontrols.net/avalonia/docking"
<mxd:DockManager>
<mxd:DockGroup>
<mxd:DockGroup Orientation="Vertical">
<mxd:DocumentGroup></mxd:DocumentGroup>
<mxd:DockPane Header="Error List"/>
</mxd:DockGroup>
<mxd:TabbedGroup>
<mxd:DockPane Header="Properties"/>
<mxd:DockPane Header="Debug"/>
</mxd:TabbedGroup>
</mxd:DockGroup>
</mxd:DockManager>
7. Добавление панели 'Output'¶
Панель 'Output' должна отображаться справа от панели 'Error List'. В настоящее время панель 'Error List' принадлежит контейнеру, который располагает свои дочерние элементы вертикально. Таким образом, нам нужно агрегировать панели 'Error List' и 'Output' в новый контейнер (DockGroup
) с горизонтальной ориентацией.
xmlns:mxd="https://schemas.eremexcontrols.net/avalonia/docking"
<mxd:DockManager>
<mxd:DockGroup>
<mxd:DockGroup Orientation="Vertical">
<mxd:DocumentGroup></mxd:DocumentGroup>
<mxd:DockGroup Orientation="Horizontal">
<mxd:DockPane Header="Error List"/>
<mxd:DockPane Header="Output"/>
</mxd:DockGroup>
</mxd:DockGroup>
<mxd:TabbedGroup>
<mxd:DockPane Header="Properties"/>
<mxd:DockPane Header="Debug"/>
</mxd:TabbedGroup>
</mxd:DockGroup>
</mxd:DockManager>
8. Заполнение группы документов вкладками¶
Добавьте два объекта DocumentPane
в контейнер DocumentGroup
. DocumentGroup
отображает свои дочерние элементы в виде вкладок, thus реализуя интерфейс с вкладками (MDI).
xmlns:mxd="https://schemas.eremexcontrols.net/avalonia/docking"
<mxd:DockManager>
<mxd:DockGroup>
<mxd:DockGroup Orientation="Vertical">
<mxd:DocumentGroup>
<mxd:DocumentPane Header="BarItemsPageView.axaml"/>
<mxd:DocumentPane Header="PageViewModelBase.cs"/>
</mxd:DocumentGroup>
<mxd:DockGroup Orientation="Horizontal">
<mxd:DockPane Header="Error List"/>
<mxd:DockPane Header="Output"/>
</mxd:DockGroup>
</mxd:DockGroup>
<mxd:TabbedGroup>
<mxd:DockPane Header="Properties"/>
<mxd:DockPane Header="Debug"/>
</mxd:TabbedGroup>
</mxd:DockGroup>
</mxd:DockManager>
9. Установка размера для закрепленных панелей¶
Пространство любого разделяемого контейнера (DockGroup
) по умолчанию делится поровну между его дочерними элементами. Вы можете использовать свойства DockWidth
и DockHeight
для установки пользовательского размера для дочерних элементов докинга контейнера. Эти свойства имеют тип Avalonia.Controls.GridLength
, поэтому вы можете установить эти свойства в следующие значения:
- Количество пикселей (абсолютные значения).
- Взвешенная пропорция доступного пространства, используя обозначение 'star (
*
) sizing'. Например,3*
. - Значение 'Auto' — Элемент автоматически изменяет размер в соответствии с его содержимым.
Приведенный ниже код использует свойства DockWidth
и DockHeight
для установки пропорционального размера для панелей и контейнеров.
xmlns:mxd="https://schemas.eremexcontrols.net/avalonia/docking"
<mxd:DockManager>
<mxd:DockGroup>
<mxd:DockGroup Orientation="Vertical" DockWidth="3*">
<mxd:DocumentGroup DockHeight="2*">
<mxd:DocumentPane Header="BarItemsPageView.axaml"/>
<mxd:DocumentPane Header="PageViewModelBase.cs"/>
</mxd:DocumentGroup>
<mxd:DockGroup Orientation="Horizontal" DockHeight="*">
<mxd:DockPane Header="Error List"/>
<mxd:DockPane Header="Output"/>
</mxd:DockGroup>
</mxd:DockGroup>
<mxd:TabbedGroup DockWidth="*">
<mxd:DockPane Header="Properties"/>
<mxd:DockPane Header="Debug"/>
</mxd:TabbedGroup>
</mxd:DockGroup>
</mxd:DockManager>
10. Создание автоматически скрываемой панели¶
Автоматически скрываемая панель автоматически сворачивается, когда теряет фокус. Для свернутых автоматически скрываемых панелей отображаются только заголовки.
Чтобы создать автоматически скрываемую панель в XAML, добавьте контейнер AutoHideGroup
в коллекцию DockManager.AutoHideGroups
, а затем определите панель DockPane
в контейнере AutoHideGroup
.
xmlns:mxd="https://schemas.eremexcontrols.net/avalonia/docking"
<mxd:DockManager>
<!--...-->
<mxd:DockManager.AutoHideGroups>
<mxd:AutoHideGroup Dock="Left">
<mxd:DockPane Header="Explorer"/>
</mxd:AutoHideGroup>
</mxd:DockManager.AutoHideGroups>
</mxd:DockManager>
Свойство AutoHideGroup.Dock
позволяет указать край, на котором отображается контейнер автоматического скрытия.
11. Создание плавающей панели¶
Пользователь может перетащить панель мышью из закрепленного состояния, чтобы перевести панель в плавающий режим.
Вы также можете определить плавающую панель в XAML. Для этого добавьте контейнер FloatGroup
в коллекцию DockManager.FloatGroups
, а затем добавьте панель DockPane
в контейнер FloatGroup
.
xmlns:mxd="https://schemas.eremexcontrols.net/avalonia/docking"
<mxd:DockManager>
<!--...-->
<mxd:DockManager.FloatGroups>
<mxd:FloatGroup FloatLocation="300,300" FloatWidth="150" FloatHeight="100">
<mxd:DockPane Header="Search"/>
</mxd:FloatGroup>
</mxd:DockManager.FloatGroups>
</mxd:DockManager>
Используйте свойства FloatWidth
и FloatHeight
для указания размера плавающего окна.
Вы также можете применить присоединенные свойства FloatGroup.FloatWidth
и FloatGroup.FloatHeight
к любой панели, даже в закрепленном состоянии. Эти настройки будут определять начальный плавающий размер, когда панель будет переведена в плавающий режим.
12. Установка заголовков и глифов панелей¶
Вы можете использовать свойства Header
и Glyph
для указания заголовков и глифов для Dock-панелей и Document-панелей.
Следующий XAML инициализирует заголовки для панелей 'Properties' и 'Debug' и отображает SVG-изображения в заголовках. Предполагается, что SVG-изображения, используемые в этом примере, имеют свойство Build Action
, установленное в AvaloniaResource
.
<mxd:TabbedGroup DockWidth="*">
<mxd:DockPane
Header="Properties"
Glyph="{SvgImage 'avares://EremexAvaloniaApplication1/Images/settings.svg'}"
GlyphSize="16,16"/>
<mxd:DockPane
Header="Debug"
Glyph="{SvgImage 'avares://EremexAvaloniaApplication1/Images/debug2.svg'}"
GlyphSize="16,16"/>
</mxd:TabbedGroup>
13. Указание содержимого панелей¶
Используйте свойство DockPane.Content
для определения содержимого Dock-панелей и Document-панелей. В XAML вы можете определить содержимое панели между начальным и конечным тегами <DockPane> и <DocumentPane>.
xmlns:mxd="https://schemas.eremexcontrols.net/avalonia/docking"
xmlns:mxe="https://schemas.eremexcontrols.net/avalonia/editors"
xmlns:mxi="https://schemas.eremexcontrols.net/avalonia/icons"
<mxd:DockPane Header="Search">
<Grid RowDefinitions="Auto *">
<StackPanel>
<mxe:ButtonEditor Watermark="Search" Margin="5">
<mxe:ButtonEditor.Buttons>
<mxe:ButtonSettings ToolTip.Tip="Match case"
Glyph="{x:Static mxi:Filter.Starts_with }"
ButtonKind="Toggle"/>
<mxe:ButtonSettings ToolTip.Tip="Match whole word"
Glyph="{x:Static mxi:Painting.Report_text_column }"
ButtonKind="Toggle"/>
</mxe:ButtonEditor.Buttons>
</mxe:ButtonEditor>
<mxe:ButtonEditor Watermark="Replace" Margin="5"/>
</StackPanel>
<TextBlock Grid.Row="1"
Text="No search results available"
TextWrapping="Wrap"
TextAlignment="Center"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Grid>
</mxd:DockPane>
См. демо "IDE Layout" для примера, который создает сложный макет док-панелей и определяет содержимое для различных панелей.
14. Полный код¶
Ниже вы можете найти полный код этого руководства. SVG-изображения, используемые в этом примере, включены в проект как 'Avalonia Resources'.
MainWindow.axaml:
<mx:MxWindow xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mx="https://schemas.eremexcontrols.net/avalonia"
xmlns:mxd="https://schemas.eremexcontrols.net/avalonia/docking"
xmlns:mxe="https://schemas.eremexcontrols.net/avalonia/editors"
xmlns:mxi="https://schemas.eremexcontrols.net/avalonia/icons"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="EremexAvaloniaApplication1.MainWindow"
Title="EremexAvaloniaApplication1"
>
<mxd:DockManager>
<mxd:DockGroup>
<mxd:DockGroup Orientation="Vertical" DockWidth="3*">
<mxd:DocumentGroup DockHeight="2*">
<mxd:DocumentPane Header="BarItemsPageView.axaml"/>
<mxd:DocumentPane Header="PageViewModelBase.cs"/>
</mxd:DocumentGroup>
<mxd:DockGroup Orientation="Horizontal" DockHeight="*">
<mxd:DockPane Header="Error List"/>
<mxd:DockPane Header="Output"/>
</mxd:DockGroup>
</mxd:DockGroup>
<mxd:TabbedGroup DockWidth="*">
<mxd:DockPane
Header="Properties"
Glyph="{SvgImage 'avares://EremexAvaloniaApplication1/Images/settings.svg'}"
GlyphSize="16,16"/>
<mxd:DockPane
Header="Debug"
Glyph="{SvgImage 'avares://EremexAvaloniaApplication1/Images/debug2.svg'}"
GlyphSize="16,16"/>
</mxd:TabbedGroup>
</mxd:DockGroup>
<mxd:DockManager.AutoHideGroups>
<mxd:AutoHideGroup Dock="Left">
<mxd:DockPane Header="Explorer"/>
</mxd:AutoHideGroup>
</mxd:DockManager.AutoHideGroups>
<mxd:DockManager.FloatGroups>
<mxd:FloatGroup FloatLocation="300,300" FloatWidth="200" FloatHeight="250">
<mxd:DockPane Header="Search">
<Grid RowDefinitions="Auto *">
<StackPanel>
<mxe:ButtonEditor Watermark="Search" Margin="5">
<mxe:ButtonEditor.Buttons>
<mxe:ButtonSettings ToolTip.Tip="Match case"
Glyph="{x:Static mxi:Filter.Starts_with }"
ButtonKind="Toggle"/>
<mxe:ButtonSettings ToolTip.Tip="Match whole word"
Glyph="{x:Static mxi:Painting.Report_text_column }"
ButtonKind="Toggle"/>
</mxe:ButtonEditor.Buttons>
</mxe:ButtonEditor>
<mxe:ButtonEditor Watermark="Replace" Margin="5"/>
</StackPanel>
<TextBlock Grid.Row="1"
Text="No search results available"
TextWrapping="Wrap"
TextAlignment="Center"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Grid>
</mxd:DockPane>
</mxd:FloatGroup>
</mxd:DockManager.FloatGroups>
</mxd:DockManager>
</mx:MxWindow>
См. также¶
- Dock Manager
- Dock-панели и контейнеры
- Document-панели
- Использование шаблона MVVM для заполнения элементов докинга
- Сохранение и восстановление макета панелей
* Эта страница была переведена с помощью нейросети Deepseek.