Panels Overview
Panel
元素是控制元素的呈现方式的组件,包括元素的大小和尺寸、位置以及子内容的排列。Avalonia UI 提供了许多预定义的 Panel
元素,同时也支持构建自定义的 Panel
元素。
Panel 类
Panel
是所有在 Avalonia 中提供布局支持的元素的基类。派生的 Panel
元素用于在 XAML 和代码中定位和排列元素。
Avalonia 包含一套全面的派生面板实现,支持许多复杂的布局。这些派生类公开了属性和方法,以支持大多数标准的 UI 场景。无法找到满足需求的子元素排列行为的开发人员可以通过重写 ArrangeOverride
和 MeasureOverride
方法来创建新的布局。有关自定义布局行为的更多信息,请参阅 Create a Custom Panel。
Panel 公共成员
所有 Panel
元素支持 Control
定义的基本大小和定位属性,包括 Height
、Width
、HorizontalAlignment
、VerticalAlignment
和 Margin
。有关由 Control
定义的定位属性的更多信息,请参阅 Alignment、Margin 和 Padding。
Panel
还公开了其他 一些属性,在理解和使用布局方面非常重要。Background
属性用于使用 Brush
填充派生面板元素边界之间的区域。Children
表示 Panel
所包含的子元素集合。
附加属性
派生的面板元素广泛使用附加属性。附加属性是一种特殊形式的依赖属性,它没有常规的公共语言运行时 (CLR) 属性 "包装器"。附加属性在 XAML 中有一种特殊的语法,后面的示例中会看到。
附加属性的一个用途是允许子元素存储父元素实际定义的属性的唯一值。这个功能的一个应用是让子元素告诉父元素它们希望在 UI 中如何呈现,这对应用程序布局非常有用。
用户界面面板
Avalonia 中有几个优化支持 UI 场景的面板类:Panel
、Canvas
、DockPanel
、Grid
、StackPanel
、WrapPanel
和 RelativePanel
。这些面板元素易于使用,足够灵活且可扩展,适用于大多数应用程序。
Canvas
Canvas
元素允许按绝对 x- 和 y- 坐标定位内容。元素可以绘制在唯一位置;或者,如果元素占据相同的坐标,则在标记中出现的顺序决定元素的绘制顺序。
Canvas
提供了最灵活的布局支持。Height
和 Width
属性用于定义画布的区域,其中的元素被赋予相对于父 Canvas
区域的绝对坐标。四个附加属性 Canvas.Left
、Canvas.Top
、Canvas.Right
和 Canvas.Bottom
允许精确地控制对象在 Canvas
内的位置,从而使开发人员可以精确定位和排列元素在屏幕上的位置。
ClipToBounds 在 Canvas 中
Canvas
可以将子元素定位在屏幕上的任何位置,甚至在超出其自定义的 Height
和 Width
的坐标。此外,Canvas
不受其子元素大小的影响。因此,子元素有可能覆盖位于父 Canvas
限界矩形之外的其他元素。Canvas
的默认行为是允许子元素绘制在父 Canvas
限界之外。如果不希望出现这种情况,可以将 ClipToBounds
属性设置为 true
## RelativePanel
定义和使用 Canvas
使用 XAML 或代码可以简单地实例化一个 Canvas
。下面的示例演示了如何使用 Canvas
来绝对定位内容。该代码生成了三个大小为 100 像素的正方形。第一个正方形为红色,其左上角的 (x, y) 位置被指定为 (0, 0)。第二个正方形为绿色,其左上角位置为 (100, 100),刚好在第一个正方形的右下方。第三个正方形为蓝色,其左上角位置为 (50, 50),因此覆盖了第一个正方形的右下象限和第二个正方形的左上象限。由于第三个正方形是最后布局的,它出现在其他两个正方形的上方,即重叠部分采用第三个正方形的颜色。

- XAML
- C#
<Canvas Height="400" Width="400">
<Canvas Height="100" Width="100" Top="0" Left="0" Background="Red"/>
<Canvas Height="100" Width="100" Top="100" Left="100" Background="Green"/>
<Canvas Height="100" Width="100" Top="50" Left="50" Background="Blue"/>
</Canvas>
// Create the Canvas
myParentCanvas = new Canvas();
myParentCanvas.Width = 400;
myParentCanvas.Height = 400;
// Define child Canvas elements
myCanvas1 = new Canvas();
myCanvas1.Background = Brushes.Red;
myCanvas1.Height = 100;
myCanvas1.Width = 100;
Canvas.SetTop(myCanvas1, 0);
Canvas.SetLeft(myCanvas1, 0);
myCanvas2 = new Canvas();
myCanvas2.Background = Brushes.Green;
myCanvas2.Height = 100;
myCanvas2.Width = 100;
Canvas.SetTop(myCanvas2, 100);
Canvas.SetLeft(myCanvas2, 100);
myCanvas3 = new Canvas();
myCanvas3.Background = Brushes.Blue;
myCanvas3.Height = 100;
myCanvas3.Width = 100;
Canvas.SetTop(myCanvas3, 50);
Canvas.SetLeft(myCanvas3, 50);
// Add child elements to the Canvas' Children collection
myParentCanvas.Children.Add(myCanvas1);
myParentCanvas.Children.Add(myCanvas2);
myParentCanvas.Children.Add(myCanvas3);
DockPanel
DockPanel
元素使用附加属性 DockPanel.Dock
来设置子内容元素在容器边缘的位置。当 DockPanel.Dock
设置为 Top
或 Bottom
时,它会将子元素放置在彼此的上方或下方。当 DockPanel.Dock
设置为 Left
或 Right
时,它会将子元素放置在彼此的左侧或右侧。LastChildFill
属性决定了最后一个作为 DockPanel
子元素添加的元素的位置。
你可以使用 DockPanel
来定位一组相关的控件,例如一组按钮。或者,你可以使用它来创建一个“分栏式”的用户界面。