Dock
AvaloniaUIKit.Dock 包为 Dock.Avalonia 提供停靠布局,以及停靠区的标签栏、分割手柄与放置目标。
<DockControl Width="640" Height="360" InitializeLayout="True" InitializeFactory="True">
<DockControl.Factory>
<Factory />
</DockControl.Factory>
<RootDock Id="Root" IsCollapsable="False" DefaultDockable="{Binding #Main}">
<ProportionalDock x:Name="Main" Id="Main" Orientation="Vertical">
<ProportionalDock Id="Top" Orientation="Horizontal">
<ToolDock Id="Left" Proportion="0.35" Alignment="Left" ActiveDockable="{Binding #Explorer}">
<Tool x:Name="Explorer" Id="Explorer" Title="Explorer">
<TextBlock Text="Explorer" Margin="16" />
</Tool>
<Tool Id="Search" Title="Search">
<TextBlock Text="Search" Margin="16" />
</Tool>
</ToolDock>
<ProportionalDockSplitter />
<DocumentDock Id="Documents" ActiveDockable="{Binding #Editor}">
<Document x:Name="Editor" Id="Editor" Title="Editor">
<TextBlock Text="Editor" Margin="16" />
</Document>
<Document Id="Readme" Title="README.md">
<TextBlock Text="README.md" Margin="16" />
</Document>
</DocumentDock>
</ProportionalDock>
<ProportionalDockSplitter />
<ToolDock Id="Bottom" Proportion="0.35" Alignment="Bottom" ActiveDockable="{Binding #Terminal}">
<Tool x:Name="Terminal" Id="Terminal" Title="Terminal">
<TextBlock Text="Terminal" Margin="16" />
</Tool>
<Tool Id="Problems" Title="Problems">
<TextBlock Text="Problems" Margin="16" />
</Tool>
</ToolDock>
</ProportionalDock>
</RootDock>
</DockControl>用法
Dock.Avalonia 把工具与文档排布到可拆分、可调整大小、可在各分组之间拖动并且可浮动的分组中。它的主题是单独的包:添加 AvaloniaUIKit.Dock,并在应用样式中把 UIKitDockTheme 放在 UIKitTheme 之后,以替代 Dock 自带的 DockFluentTheme 或 DockSimpleTheme。该包面向 Dock.Avalonia 12.1.0.6。
<Application xmlns="https://github.com/avaloniaui"
xmlns:uikit="clr-namespace:AvaloniaUIKit;assembly=AvaloniaUIKit"
xmlns:uikitdock="clr-namespace:AvaloniaUIKit;assembly=AvaloniaUIKit.Dock">
<Application.Styles>
<uikit:UIKitTheme />
<uikitdock:UIKitDockTheme />
</Application.Styles>
</Application>含两个或更多可停靠项的分组带有标签栏:标签本身、标签之后的空白(把标签拖到此处即可加入该分组),以及一个带分组菜单(浮动、停靠、自动隐藏、关闭)的工具栏。只含一个工具的工具停靠区则改用带工具标题与菜单的标题栏。文档标签带有关闭按钮(Dock 的 CloseButtonShowMode),并且在设置 CanCreateDocument 时,工具栏中还会有一个新建按钮。
分割手柄不占空间:分组之间是一条细线,其中的胶囊随指针悬停、按下和拖动而变大。拖动标签时,指针下方的分组会显示它将落在何处:它的左三分之一或右三分之一会把标签左右分栏,它的上三分之一或下三分之一(位于中部时)会上下分栏,而在中间则把标签加入该分组。把标签拖到某个标签上,或拖到标签栏的空白处,同样会把它加入该分组。固定到边缘(自动隐藏)的工具沿边缘的一条条带排列。
浮动窗口与浏览器
Dock 会把拖动的工具或文档浮动到独立的窗口中。在没有窗口的环境(如浏览器)里,请设置 DockSettings.UseManagedWindows(或根停靠区的 FloatingWindowHostMode),让它们在停靠控件内部绘制。此时在 Avalonia 12 下,Dock 12.1.0.6 会把拖动预览遗留在停靠控件的角落;本站的实时演示将它隐藏。
NativeAOT
AvaloniaUIKit.Dock 自身没有裁剪警告,但 Dock.Avalonia 不可裁剪,因此不保证支持 NativeAOT。Dock 按名称绑定其分割手柄的 CanResize 与 ResizePreview:裁剪时,请在你的模型包的分割器模型上保留这些成员。
[DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties,
typeof(Dock.Model.Avalonia.Controls.ProportionalDockSplitter))]
public static void Main(string[] args) => ...示例
带关闭按钮与新建按钮的文档停靠区。
<DockControl Width="640" Height="280" InitializeLayout="True" InitializeFactory="True">
<DockControl.Factory>
<Factory />
</DockControl.Factory>
<RootDock Id="Root" IsCollapsable="False" DefaultDockable="{Binding #Files}">
<DocumentDock x:Name="Files" Id="Files" CanCreateDocument="True" ActiveDockable="{Binding #Program}">
<Document x:Name="Program" Id="Program" Title="Program.cs">
<TextBlock Text="Program.cs" Margin="16" />
</Document>
<Document Id="App" Title="App.axaml">
<TextBlock Text="App.axaml" Margin="16" />
</Document>
<Document Id="Readme" Title="README.md">
<TextBlock Text="README.md" Margin="16" />
</Document>
</DocumentDock>
</RootDock>
</DockControl>固定到左边缘的工具;点击其中一个即可显示它。
<DockControl Width="640" Height="280" InitializeLayout="True" InitializeFactory="True">
<DockControl.Factory>
<Factory />
</DockControl.Factory>
<RootDock Id="Root" IsCollapsable="False" DefaultDockable="{Binding #Center}">
<RootDock.LeftPinnedDockables>
<Tool Id="Outline" Title="Outline">
<TextBlock Text="Outline" Margin="16" />
</Tool>
<Tool Id="Git" Title="Source Control">
<TextBlock Text="Source Control" Margin="16" />
</Tool>
</RootDock.LeftPinnedDockables>
<ToolDock x:Name="Center" Id="Center" ActiveDockable="{Binding #Editor}">
<Tool x:Name="Editor" Id="Editor" Title="Editor">
<TextBlock Text="Editor" Margin="16" />
</Tool>
</ToolDock>
</RootDock>
</DockControl>