avalonia学习之布局组件

news2024/11/15 23:55:57

border

边框控件用边框和背景装饰一个(单个)子控件。它还可用于显示圆角。

属性

属性描述
Background背景颜色。
BorderBrush边框颜色。
BorderThickness边框线粗细(整数)。
CornerRadius所有四个角的半径(一个值),或指定为列表,2个值Top Bottom,4个值TopLeft TopRight BottomRight BottomLeft
BoxShadow定义阴影

案例

<StackPanel>
    <Border Background="Gainsboro"
          BorderBrush="Black"
          BorderThickness="2"
          CornerRadius="3"
          Padding="10" Margin="10">
      <TextBlock>Box 1</TextBlock>
    </Border>
    <Border Background="Gainsboro"
            BorderBrush="Black"
            BorderThickness="2"
            CornerRadius="3"
            Padding="10" Margin="10">
      <TextBlock>Box 2</TextBlock>
    </Border>
  </StackPanel>

在这里插入图片描述
您可以通过设置边框的框阴影属性来定义边框的阴影。您可以使用以下命令指定单个长方体阴影:

  • 一个可选的inset关键字——这将在边框内绘制阴影——通常不太有用!
  • 两个、三个或四个长度值
  • 颜色值
属性描述
inset如果未指定(默认),则假定阴影为阴影(好像框高出内容)。 inset 关键字的存在会将阴影更改为框架内部(好像内容被压在框内)。 插入阴影绘制在边框内(即使是透明边框),并且位于背景上方但位于任何内容下方
offset-x指定水平距离。负值表示阴影位于元素左侧。
offset-y指定垂直距离。负值表示阴影位于元素上方。
blur-radius该值越大,模糊效果越大,因此阴影变得更大、更亮。不允许使用负值。如果未指定,则使用默认值(零),阴影边缘清晰。
spread-radius正值将导致阴影扩大并变大,负值将导致阴影缩小。如果未指定,它将为0(阴影将与元素大小相同)。
color使用颜色名称(如红色)或#前缀和十六进制颜色值的阴影颜色。例如:#dadada

在这里插入图片描述

canvas

画布控件在指定位置(以坐标表示)显示其子控件。
每个子控件的位置定义为画布内容区域边缘与子边距区域外边缘之间的两个距离。例如,这可能是画布左上角的孩子的左上角,如下所示:
在这里插入图片描述

属性

属性描述
Canvas.Left附加到子控件-给出画布内容区域的左内边缘到子控件的左外边缘(边距区域)之间的距离
Canvas.Top附加到子控件-给出画布内容区域的内上边缘到子控件(边距区域)的外上边缘之间的距离。
Canvas.Right附加到子控件-给出画布内容区域的右内边缘到子控件的右外边缘(边距区域)之间的距离。
Canvas.Bottom附加到子控件-给出画布内容区域的内底边缘到子控件(边距区域)的外底边缘之间的距离。
Canvas.ZIndex附加到子控件-这可以覆盖默认的绘图顺序,默认情况下,每个子项的z索引为零。但是,画布支持canvas。ZIndex附加属性,您可以设置任何子控件。这将覆盖绘图顺序(最后绘制的数字最高),因此可能会改变子控件的重叠方式。
Opacity无论您如何定义绘图顺序,都会尊重子控件的不透明度。这意味着,当子控件元素重叠时,重叠区域中显示的内容可能会在顶部控件的不透明度值小于1的情况下混合。
<Canvas Background="AliceBlue" Margin="20">
      <Rectangle Fill="Red" Height="100" Width="100" Margin="10"/>
      <Rectangle Fill="Blue" Height="100" Width="100" Opacity="0.5"
                Canvas.Left="50" Canvas.Top="20"/>
      <Rectangle Fill="Green" Height="100" Width="100" 
                Canvas.Left="60" Margin="40" Canvas.Top="40"/>
      <Rectangle Fill="Orange" Height="100" Width="100" 
                Canvas.Right="70" Canvas.Bottom="60"/>
   </Canvas>

在这里插入图片描述
修改ZIndex

<Rectangle Fill="Blue" Height="100" Width="100" Opacity="0.5"
                Canvas.Left="50" Canvas.Top="20" ZIndex="2"/>

在这里插入图片描述

DockPanel

沿指定边(上、下、左、右)排列子控件,其中一个边填充任何剩余空间。
DockPanel控件沿着指定的“对接边缘”(顶部、底部、左侧和右侧)排列其子控件,最后一个子控件填充任何剩余空间。停靠面板可以保持子控件的尺寸与停靠边缘平行,以便子控件填充沿停靠边缘的所有可用空间。
例如,如果子控件上的停靠边被定义为“top”,并且它定义了高度,但没有宽度,它将绘制如下:
在这里插入图片描述

您必须定义垂直于对接边的子控件尺寸,否则它将不会显示。

您可以选择定义与对接边平行的尺寸。在这种情况下,子对象将根据对齐设置沿相同方向绘制。例如,具有定义宽度的子对象停靠在顶部边缘,将遵守其水平对齐属性(默认中心)。

子控件按照XAML中定义的顺序停靠。当Avalonia UI调整子控件的大小时,会考虑之前绘制的任何控件的存在。这意味着永远不会有任何重叠。

定义的最后一个子控件将填充任何剩余空间。

您必须始终定义最后一个子控件(没有停靠属性),否则停靠计算将无法正确执行。这意味着底座面板至少需要两个子控件。

属性

属性描述
DockPanel.Dock.Left附加在子控件上-将其停靠在左侧。
DockPanel.Dock.Top附加在子控件上-将其停靠在顶部。
DockPanel.Dock.Right附加在子控件上-将其停靠在右侧。
DockPanel.Dock.Bottom附加在子控件上-将其停靠在底部。
<DockPanel Width="300" Height="300">
        <Rectangle Fill="Red" Height="100" DockPanel.Dock="Top"/>
        <Rectangle Fill="Blue" Width="100" DockPanel.Dock="Left" />
        <Rectangle Fill="Green" Height="100" DockPanel.Dock="Bottom"/>
        <Rectangle Fill="Orange" Width="100" DockPanel.Dock="Right" Opacity="0.5"/>
        <Rectangle Fill="Gray" />
</DockPanel>

在这里插入图片描述

Expander

Expander控件有一个标题区域(始终可见)和一个可折叠的内容部分,可以包含一个子控件。

属性

属性描述
Expander.Header定义标题区域中显示的内容。
<Expander VerticalAlignment="Top">
    <Expander.Header>
        Hidden Search
    </Expander.Header>
    <Grid RowDefinitions="*,*" ColumnDefinitions="150,*">
        <TextBlock Grid.Row="0" Grid.Column="0"
                   VerticalAlignment="Center">
            Search
        </TextBlock>
        <TextBox Grid.Row="0" Grid.Column="1"
                 Watermark="Search text" Width="200" />
        <TextBlock Grid.Row="1" Grid.Column="0"
                   VerticalAlignment="Center">
            Case sensitive?
        </TextBlock>
        <CheckBox Grid.Row="1" Grid.Column="1" />
    </Grid>
</Expander>

在这里插入图片描述
在这里插入图片描述

Grid

Grid控件可用于在列和行中排列子控件。您可以为Grid定义绝对、比例和自动调整大小的行和列几何图形。
Grid中的每个子控件都可以使用列和行坐标定位在Grid单元格中。这些都是从零开始的,并且都有零默认值。
如果将多个子控件放置在同一单元格中,它们将按照XAML中显示的顺序绘制在该单元格中。这是除Panel之外实施层堆叠的另一种策略。

如果省略Grid的子控件的列和行坐标,则它们都将绘制在左上角(列=0,行=0)。

也可以使子控件在行或列中跨越多个单元格,或同时跨越这两个单元格。

属性

属性描述
ColumnDefinitions描述Grid中列宽度的尺寸定义。
RowDefinitions描述Grid中行高度的大小定义。
ShowGridLines显示单元格之间的网格线(虚线)。
Grid.Column将控件布置到指定的从零开始的列中。
Grid.Row将控件布局到指定的从零开始的行中。
Grid.ColumnSpan将控件跨1列或多列。
Grid.RowSpan将控件跨1行或多行。
Grid.IsSharedSizeScope将控件定义为 SharedSizeGroup 的包含范围

绝对尺寸定义

绝对大小定义以列表格式写成整数。例如:

ColumnDefinitions="200, 200, 300"

使用完全扩展的XAML,这与以下内容相同:

<Grid>
   <Grid.ColumnDefinitions>
       <ColumnDefinition Width="200"></ColumnDefinition>
       <ColumnDefinition Width="200"></ColumnDefinition>
       <ColumnDefinition Width="300"></ColumnDefinition>
   </Grid.ColumnDefinitions>
</Grid>

比例尺寸定义

比例大小定义用星号表示可用网格空间的比例。例如,要创建两个宽度相同的列,然后创建宽度两倍的列:

ColumnDefinitions="*, *, 2*"

使用完全扩展的XAML,这与以下内容相同:

<Grid>
   <Grid.ColumnDefinitions>
       <ColumnDefinition Width="*"></ColumnDefinition>
       <ColumnDefinition Width="*"></ColumnDefinition>
       <ColumnDefinition Width="2*"></ColumnDefinition>
   </Grid.ColumnDefinitions>
</Grid>

尺寸定义不支持百分比。克服这一问题的一个技巧是创建一个所有比例值总和为 100 的定义,例如对于 3 列,使用<GridColumnDefinitions="25*, 25*, 50*">,分别占据剩余可用宽度的 25%、25% 和 50% 。

自动尺寸定义

若要将行或列的大小自动调整为其中最大的子控件,请使用代码“Auto”。例如:

RowDefinitions="Auto, Auto, Auto"

使用完全扩展的XAML,这与以下内容相同:

<Grid>
   <Grid.RowDefinitions>
       <RowDefinition Height="Auto"></RowDefinition>
       <RowDefinition Height="Auto"></RowDefinition>
       <RowDefinition Height="Auto"></RowDefinition>
   </Grid.RowDefinitions>
</Grid>

如果子控件有自己显式设置的尺寸,则在绘制时将遵循这些尺寸。这意味着如果它大于它的网格单元格,它将重叠相邻的单元格。

混合尺寸定义

您可以在相同大小的定义序列中混合上述任何一种。例如:

ColumnDefinitions="200, *, 2*"

使用完全扩展的XAML,这与以下内容相同:

<Grid>
   <Grid.ColumnDefinitions>
       <ColumnDefinition Width="200"></ColumnDefinition>
       <ColumnDefinition Width="*"></ColumnDefinition>
       <ColumnDefinition Width="2*"></ColumnDefinition>
   </Grid.ColumnDefinitions>
</Grid>

绘图规则

在计算大小时,在计算完绝对值和自动值后,将使任何比例列适合剩余的空间。
自动大小的计算是使用子控件的页边距布局区域的外部进行的。
子控件按照在XAML中出现的顺序绘制在其指定的网格单元格中。该规则既控制了两个子控件被分配到相同单元格时发生的情况,也控制了子控件比分配的单元格大时如何重叠。
当子控件具有自己的尺寸并且小于其分配的单元格时,将根据其水平和垂直对齐属性(默认情况下都是居中)在单元格中对齐。

这个例子显示了:

  • 如何使用列和行定义的缩短语法。
  • 如何混合绝对和比例列宽度。
  • 如何为子控件分配单元格。
  • 如何跨行和列。

一个具有3行和3列的网格的例子(1固定宽度),(2按比例抓取其余部分)是:

<Grid ColumnDefinitions="100,1.5*,4*" RowDefinitions="Auto,Auto,Auto"  Margin="4">
  <TextBlock Text="Col0Row0:" Grid.Row="0" Grid.Column="0"/>
  <TextBlock Text="Col0Row1:" Grid.Row="1" Grid.Column="0"/>
  <TextBlock Text="Col0Row2:" Grid.Row="2" Grid.Column="0"/>
  <CheckBox Content="Col2Row0" Grid.Row="0" Grid.Column="2"/>
  <Button Content="SpansCol1-2Row1-2" Grid.Row="1" Grid.Column="1" Grid.RowSpan="2" Grid.ColumnSpan="2"/>
</Grid>

在这里,在绝对宽度100被减去之后(对于列0),列1将得到剩余宽度的1.5部分,列2将得到剩余宽度的4部分。
绘制按钮以填充从单元格(第1列,第1行)加上一列(向右)和一行向下的跨度。结果是这样的:
在这里插入图片描述

GridSplitter

GridSplitter控件允许用户在运行时调整网格中的列或行大小。分割器绘制为列或行(可以指定大小),并具有用户可以在运行时操作的手柄。

属性

属性描述
Background分割条的背景颜色。
Grid.Column附加用于给出拆分器的(列)位置。
Grid.Row附加用于给出拆分器的(行)位置。
ResizeDirection分离器的运动方向。

为了提供任何有意义的移动,分离器的移动方向必须与其位置定义相同。也就是说:对于列拆分器指定ResizeDirection=“Columns”,对于行拆分器指定ResizeDirection=“Rows”。

这是一个列拆分器:

<Grid ColumnDefinitions="*, 4, *">
    <Rectangle Grid.Column="0" Fill="Blue"/>
    <GridSplitter Grid.Column="1" Background="Black" ResizeDirection="Columns"/>
    <Rectangle Grid.Column="2" Fill="Red"/>
</Grid>

在这里插入图片描述
这是一个行拆分器:

<Grid RowDefinitions="*, 4, *">
    <Rectangle Grid.Row="0" Fill="Blue"/>
    <GridSplitter Grid.Row="1" Background="Black" ResizeDirection="Rows"/>
    <Rectangle Grid.Row="2" Fill="Red"/>
</Grid>

在这里插入图片描述

Panel

面板是最基本的控件,可以包含多个子控件。子控件根据其水平和垂直对齐属性绘制,并按照它们在XAML中出现的顺序绘制。如果子控件占用相同的空间,则它们将重叠。
这个例子使用50%的不透明度来演示子控件重叠。
不透明

<Panel Height="300" Width="300">
    <Rectangle Fill="Red" Height="100" VerticalAlignment="Top"/>
    <Rectangle Fill="Blue" Width="100" HorizontalAlignment="Right" />
    <Rectangle Fill="Green"  Height="100" VerticalAlignment="Bottom"/>
    <Rectangle Fill="Orange" Width="100" HorizontalAlignment="Left"/>
</Panel>

在这里插入图片描述
增加透明度

<Panel Height="300" Width="300">
    <Rectangle Fill="Red" Height="100" VerticalAlignment="Top"/>
    <Rectangle Fill="Blue" Opacity="0.5" Width="100" HorizontalAlignment="Right" />
    <Rectangle Fill="Green" Opacity="0.5" Height="100" VerticalAlignment="Bottom"/>
    <Rectangle Fill="Orange" Width="100" HorizontalAlignment="Left"/>
</Panel>

在这里插入图片描述
其他Panel控件
还有其他更有用的面板,可以更好地控制其子控件的位置:

  • Stack Panel
  • Dock Panel
  • Relative Panel
  • Wrap Panel

如果您对在面板中定位子控件有特定要求,则可以基于面板创建自己的自定义控件。

RelativePanel

RelativePanel控件允许您通过指定子控件相对于其他(兄弟)子控件或相对于面板本身的位置来安排其子控件。位置是使用面板控件的内部(内容区域)和子控件的边距区域的外边缘计算的。

子控件的默认位置是面板的左上角。
使用附加的相对位置属性来指定子控件的布局。格式是这样的:

RelativePanel.PositionProperty="NameOfSibling"

其中PositionProperty属性是相对位置属性之一,NameOfSibling属性是另一个子控件的名称属性。

将相对位置属性的值作为子控件本身的名称是错误的。这将是一个循环引用!

您可以为每个子控件指定最多四个相对位置属性-用于如何计算上、下、左和右边缘。

为同一子控件两次定义相同的相对位置属性是错误的。

指定不同但可能相互冲突的相对位置属性并不是错误,尽管您可能会发现结果难以理解。
如果多个子控件最终处于相同的计算位置,则按照它们在XAML中出现的顺序绘制它们,并且可能重叠或掩盖另一个子控件。

这意味着您必须为子控件提供一个名称,并在任何相对位置属性值中使用正确的名称。如果您弄错了,控件将采用默认的(左上角)位置,并且可能重叠或掩盖另一个。

属性

属性描述
AlignTopWithPanelbool。将子控件的上边缘与面板的上边缘对齐。
AlignBottomWithPanelbool 附加到子控件以使子控件的下边缘与面板的下边缘对齐。
AlignLeftWithPanel附加到子控件以使子控件的左边缘与面板的左边缘对齐。
AlignRightWithPanel附加到子控件以使子控件的右边缘与面板的右边缘对齐。
AlignHorizontalCenterWithPanelbool 附加到子控件以使子控件的水平中心与面板的水平中心对齐。
AlignVerticalCenterWithPanelbool 附加到子控件以使子控件的垂直中心与面板的垂直中心对齐。
AlignTopWith附加到子控件以使其上边缘与已命名的兄弟控件的上边缘对齐。
AlignBottomWith附加到子控件以使其底边与已命名的兄弟控件的底边对齐。
AlignLeftWith附加到子控件以使其左边缘与已命名的兄弟控件的左边缘对齐。
AlignRightWith附加到子控件以使其右边缘与已命名的兄弟控件的右边缘对齐。
AlignHorizontalCenterWith附加到子控件以使其水平中心与已命名的兄弟控件的水平中心对齐。
AlignVerticalCenterWith附加到子控件以使其垂直中心与已命名的兄弟控件的垂直中心对齐。
Above附加到子控件以使其下边缘与已命名的兄弟控件的上边缘对齐。
Below附加到子控件以使其上边缘与已命名的兄弟控件的下边缘对齐。
LeftOf附加到子控件以使其右边缘与已命名的兄弟控件的左边缘对齐。
RightOf附加到子控件以使其左边缘与已命名的兄弟控件的右边缘对齐。

这个XAML展示了如何以不同的方式安排一些子控件:

<Border BorderBrush="DarkGray" BorderThickness="1" Width="300" Height="300">
    <RelativePanel >
        <Rectangle x:Name="RedRect" Fill="Red" Height="50" Width="50"/>
        <Rectangle x:Name="BlueRect" Fill="Blue" Opacity="0.5" Height="50" Width="150"
                RelativePanel.RightOf="RedRect" />
        <Rectangle x:Name="GreenRect" Fill="Green" Height="100"
                RelativePanel.Below="RedRect"
                RelativePanel.AlignLeftWith="RedRect"
                RelativePanel.AlignRightWith="BlueRect"/>
        <Rectangle Fill="Orange"
                RelativePanel.Below="GreenRect"
                RelativePanel.AlignLeftWith="BlueRect"
                RelativePanel.AlignRightWithPanel="True"
                RelativePanel.AlignBottomWithPanel="True"/>
    </RelativePanel>
</Border>

在这里插入图片描述

以下是关于上述例子的一些注意事项:

  • 给出了红色矩形的大小(50x50),但没有给出相对位置。因此,它被放置在默认位置(左上角)。
  • 蓝色矩形的不透明度为50%,以表明它没有重叠。
  • 这个绿色矩形有一个高度(100),但没有宽度。它的左边与红色矩形对齐,它的右边与蓝色矩形对齐,这计算了它的宽度。
  • 橙色矩形没有给定大小。它的左侧与蓝色矩形对齐。它的右侧和底部边缘与面板的边缘对齐。因此,它的大小是由对齐决定的,如果面板本身调整大小,它将调整大小。

ScrollViewer

ScrollViewer控件的内容可以大于其内容区域,并且可以提供滚动条将隐藏的内容移动到视图中。
ScrollViewer不能包含在具有无限高度或宽度(取决于滚动方向)的控件中,例如StackPanel。为了避免它,你可以设置固定的高度/宽度或MaxHeight/MaxWidth或选择另一个容器面板。

属性描述
AllowAutoHidebool,默认值为true。设置滚动条在指针未悬停或没有焦点时是否自动隐藏。
ScrollViewer.IsScrollChainingEnabledbool,默认值为true。附于内部控制

滚动链

如果您有一个本身可以滚动的控件(见下面的列表)嵌套在滚动查看器中,并且用户在控件上达到了限制,则此属性设置外部滚动查看器是否应继续滚动。您可以使用内部控件上的附加属性启用或禁用此行为,格式如下:

ScrollViewer.IsScrollChainingEnabled=[true|false]

此附加属性在以下控件上可用:

  • Scroll Viewer
  • Data Grid
  • List Box
  • Text Box
  • Tree View

此示例创建了一个大于其内部边框的堆栈面板。滚动查看器会自动创建垂直滚动条。

<Border Background="AliceBlue" Width="300" Height="300">
    <ScrollViewer>
        <StackPanel>
            <TextBlock FontSize="22" Height="100" Background="LightBlue">Block 1</TextBlock>
            <TextBlock FontSize="22" Height="100">Block 2</TextBlock>
            <TextBlock FontSize="22" Height="100" Background="LightBlue">Block 3</TextBlock>
            <TextBlock FontSize="22" Height="100">Block 4</TextBlock>
            <TextBlock FontSize="22" Height="100" Background="LightBlue">Block 5</TextBlock>
        </StackPanel>
    </ScrollViewer>
</Border>

在这里插入图片描述
在这里插入图片描述

SplitView

SplitView展示了一个由两部分组成的容器:主内容区和侧窗格。主内容区始终可见。窗格可以展开和折叠。折叠的窗格可以完全隐藏,也可以稍微打开——例如,有足够的空间容纳一些图标按钮。

属性

属性描述
PanePlacement设置窗格的位置(左侧或右侧)。
IsPaneOpen布尔值,默认值为true。窗格是否处于打开状态?
DisplayMode控制窗格在打开和关闭状态下的绘制方式
OpenPaneLength定义窗格打开时的宽度。
CompactPaneLength定义窗格关闭且显示模式紧凑时的宽度。

显示模式属性控制窗格在打开和关闭状态下的绘制方式。有四种选择:

Overlay

窗格在打开之前完全隐藏。打开时,窗格会覆盖内容区域。

Inline

窗格始终可见,宽度固定,不会覆盖内容区域。窗格和内容区域划分了可用的屏幕空间,但如果容器更改了宽度,则是内容区域调整了大小。

Compact Overlay

在此模式下,窗格的狭窄部分始终可见,其宽度刚好足以显示图标。默认的关闭窗格宽度为48px,可以使用CompactPaneLength属性值进行修改。如果打开窗格,它将覆盖内容区域。

Compact Inline

在此模式下,窗格的狭窄部分始终可见,其宽度刚好足以显示图标。默认的关闭窗格宽度为48px,可以使用CompactPaneLength属性值进行修改。如果打开窗格,它将减小内容区域的大小。

<SplitView IsPaneOpen="True"
       DisplayMode="Inline"
       OpenPaneLength="300">
    <SplitView.Pane>
        <TextBlock Text="Pane"
                FontSize="24"
                VerticalAlignment="Center"
                HorizontalAlignment="Center"/>
    </SplitView.Pane>

    <Grid>
        <TextBlock Text="Content"
                FontSize="24"
                VerticalAlignment="Center"
                HorizontalAlignment="Center"/>
    </Grid>
</SplitView>

控件看起来像这样,在Windows上运行:
在这里插入图片描述

紧凑型显示模式

您可以将MVVM模式与拆分视图控件和紧凑显示模式设置之一一起使用,以实现“工具窗格”风格的UI。窗格关闭时,窗格上有足够的空间显示打开窗格的图标按钮。
在这里插入图片描述

StackPanel

StackPanel通过水平或垂直堆叠来排列它的子控件。堆栈面板通常用于在页面上安排UI的一小部分。

在堆栈面板中,如果未设置与子控件上的堆栈垂直的size属性,则子控件将拉伸以填充可用空间。例如,在水平方向中,如果未设置子控件的高度,则子控件的高度将会拉伸。

在堆栈的方向上,堆栈面板将始终展开以适合所有子控件。

属性

属性描述
Orientation设置堆栈的方向。从水平(horizontal)或垂直(vertical 默认)中选择。
Spacing在子控件之间创建均匀间距。
<StackPanel Width="200">
    <Rectangle Fill="Red" Height="50"/>
    <Rectangle Fill="Blue" Height="50"/>
    <Rectangle Fill="Green" Height="100"/>
    <Rectangle Fill="Orange" Height="50"/>
</StackPanel>

在这里插入图片描述

<StackPanel Orientation="Horizontal" Height="50">
    <Rectangle Fill="Red" Width="50"/>
    <Rectangle Fill="Blue" Width="50"/>
    <Rectangle Fill="Green" Width="50"/>
    <Rectangle Fill="Orange" Width="50"/>
</StackPanel>

在这里插入图片描述

TabControl

TabControl允许您将视图细分为选项卡项。
每个选项卡项都有一个标题和一个内容区。标题按照它们在XAML中出现的顺序以条形显示。当用户单击选项卡标头时,它的内容变得可见,并被放置在选项卡控件内容区的选项卡条下方。
你可以在标题和内容区组合UI,以适应你的Avalonia UI应用程序的UI需求。

<TabControl Margin="5">
    <TabItem Header="Tab 1">
        <TextBlock Margin="5">This is tab 1 content</TextBlock>
    </TabItem>
    <TabItem Header="Tab 2">
        <TextBlock Margin="5">This is tab 2 content</TextBlock>
    </TabItem>
    <TabItem Header="Tab 3">
        <TextBlock Margin="5">This is tab 3 content</TextBlock>
    </TabItem>
</TabControl>

在这里插入图片描述

UniformGrid

UniformGrid将可用空间在两个方向上均匀地划分为单元格。您可以指定使用多少个分区,这些分区在任何方向上都可以不同。
然后,您可以使用附加的行和列索引属性(从零开始)将子控件分配给创建的单元格。

属性

属性描述
Rows整数。设置高度中相等的行数。
Columns整数。设置宽度中相等的列数
Grid.Column附加到子控件以设置其列索引。
Grid.Row附加到子控件以设置其行索引。
<UniformGrid Rows="1" Columns="3" Width="300" Height="200">
    <Rectangle Fill="navy" Grid.Column="0" Grid.Row="0"/>
    <Rectangle Fill="white" Grid.Column="1" Grid.Row="0"/>
    <Rectangle Fill="red" Grid.Column="2" Grid.Row="0"/>
</UniformGrid>

在这里插入图片描述

WrapPanel

WrapPanel使用(多个)子元素的默认排列是从左到右的顺序,同时它们适合宽度。当没有剩余空间(包括任何边距和边框)时,它开始一个新的行。

当方向属性设置为垂直时,排列从上到下,并在没有剩余高度时开始一个新列。

属性

属性描述
Orientation改变排列流的方向。
<WrapPanel>
        <Rectangle Fill="Navy" Width="200" Height="200" Margin="20"/>
        <Rectangle Fill="Yellow" Width="200" Height="200" Margin="20"/>
        <Rectangle Fill="Green" Width="200" Height="200" Margin="20"/>
        <Rectangle Fill="Red" Width="200" Height="200" Margin="20"/>
        <Rectangle Fill="Purple" Width="200" Height="200" Margin="20"/>
</WrapPanel>

在这里插入图片描述
竖向

<WrapPanel Orientation="Vertical">
        <Rectangle Fill="Navy" Width="100" Height="100" Margin="20"/>
        <Rectangle Fill="Yellow" Width="100" Height="100" Margin="20"/>
        <Rectangle Fill="Green" Width="100" Height="100" Margin="20"/>
        <Rectangle Fill="Red" Width="100" Height="100" Margin="20"/>
        <Rectangle Fill="Purple" Width="100" Height="100" Margin="20"/>
</WrapPanel>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2048714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决com.google.android.play:core:1.10.3在10.1号之后targetSDK升到34的问题

implementation com.google.android.play:core:1.10.3或者这样的 升到android14 之后可能提审的时候都会遇到这个问题&#xff0c;解决方法如下&#xff1a; implementation com.google.android.play:asset-delivery:2.2.2 implementation com.google.android.play:app-update…

刀锋利器:Knife4j助你轻松驾驭API文档

文章目录 整合Knife4j引入依赖编写配置文件 法①编写配置文件 法②配置名词解释注解三兄弟 : ApiOperation、ApiParam、ApiModel 启动项目, 访问Knife4j测试Knife4j优点支持全局参数支持离线文档支持API搜索 **技术派项目源码地址 : ** **Gitee : **技术派 - https://gitee.co…

解密键盘输入:探索设备控制器的奥秘

流程初探 键盘是我们最常用的输入硬件设备之一。作为程序员&#xff0c;你知道当我们敲击键盘上的字母"A"时&#xff0c;操作系统会发生什么吗&#xff1f;下面我将简要介绍整个过程&#xff0c;以便你更容易理解为什么需要这些组件。 首先&#xff0c;让我们来看看…

Processing练习之鼠标控制线段粗细

案例代码如下&#xff1a; import processing.pdf.*; import java.util.Calendar; boolean savePDF false; int tileCount 20; int actRandomSeed 0; int actStrokeCap ROUND; void setup(){ size(600,600); } void draw(){ if(savePDF)beginRecord(PDF, timestamp()"…

回调函数,字符函数,字符串函数

前言&#xff1a;上一趴我们学习了指针。那么今天我们来学习新的知识&#xff0c;回调函数&#xff0c;字符函数&#xff0c;字符串函数。 1 回调函数 什么是回调函数呢&#xff1f;回调函数就是通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作…

加热系统加入达温即停和保温功能

加热系统加入达温即停和保温功能 引言 ​ 我们前一节, 是通过控制io口, 直接控制加热的开关, 但是这太简单粗暴了, 如果只是那样, 和普通的家居电器,是没区别的, 我们想要更智能一点, 就是像咱们自己家的热水壶那样, 水烧滚了(水温达到100摄氏度), 就自动停止了. 加热功能&a…

SQL每日一练-0816

今日SQL题&#xff1a;计算每个项目的年度收入增长率 难度系数&#xff1a;&#x1f31f;☆☆☆☆☆☆☆☆☆ 1、题目要求 计算每个项目每年的收入总额&#xff0c;并计算项目收入环比增长率。找出每年收入增长率最高的项目。输出结果显示年份、项目ID、项目名称、项…

JS周结 day0817

ok了家人们&#xff0c;今天这周学习了JavaScript&#xff0c;我们一起看一下吧 一.JavaScript概述 1.1 应用场景 JavaScript 用来做前端页面校验 JavaScript 可以实现网页的一些动画效果&#xff0c;例如&#xff1a;轮播图 1.2 JavaScript介绍 JavaScript 是一门跨平台、…

华为OD(C卷,200分)- 智能驾驶

(C卷,200分)- 智能驾驶 题目描述 有一辆汽车需要从 m * n 的地图左上角(起点)开往地图的右下角(终点),去往每一个地区都需要消耗一定的油量,加油站可进行加油。 请你计算汽车确保从从起点到达终点时所需的最少初始油量。 说明: 智能汽车可以上下左右四个方向移动 地图…

Monaco Editor组件使用详解

Monaco Editor 是由微软开发并开源的一款代码编辑器&#xff0c;它是 Visual Studio Code&#xff08;VS Code&#xff09;的核心部分。Monaco Editor 提供了丰富的特性&#xff0c;包括语法高亮、代码折叠、代码提示&#xff08;IntelliSense&#xff09;、多光标选择、搜索和…

RabbitMQ消息队列总结

RabbitMQ那些事 参考一. `RabbitMQ`介绍1.1 Java工程师1.1.1 RabbitMQ学习目标1.1.2 消息队列介绍1.1.3 RabbitMQ介绍各自属性介绍(❤❤❤)二. `RabbitMQ`安装1. 基于Linux1.1 安装1.2 常用命令1.3 后台管理开启与面板介绍三. 客户端`SDK`操作(❤❤了解)1. 客户端依赖1. 生产者…

【区块链+金融服务】中国银联区块链可信存证服务 | FISCO BCOS应用案例

随着金融行业信息化的快速推进&#xff0c;“互联网 金融”业务产生了海量的电子数据。例如&#xff0c;截止到 2022 年第二季度&#xff0c; 全国累计信用卡发卡数量约 8.07 亿张&#xff0c;累计银行卡应偿信贷余额为 8.66 万亿元&#xff0c;累计信用卡逾期半年未尝信贷 总…

18124 N皇后问题

### 详细分析 这是一个经典的N皇后问题。我们需要在N\*N的棋盘上放置N个皇后&#xff0c;使得任意两个皇后不在同一行、同一列或同一对角线上。可以使用回溯算法来解决这个问题。 ### 伪代码 1. 定义一个函数countSolutions&#xff0c;输入为N&#xff0c;输出为N皇后问题的解…

尚硅谷MYSQL(5-6章)

排序和分页 排序 如果没有使用排序操作的话 查询出来的数据是按添加的顺序排序的 ORDER BY是来进行排序的 后面可以添加ASC升序 DESC降序 如果后面没有显示指明排序的方式的话 则默认按照升序排序 where中不能使用列的别名 我们在使用sql语句的时候 她的执行顺序不是从第一…

Python 环境搭建指南 超详细

Python是由荷兰⼈吉多范罗苏姆&#xff08;Guido von Rossum&#xff0c;后⾯都称呼他为Guido&#xff09;发明的⼀种编程语言 1. 1989年圣诞节&#xff1a;Guido开始写Python语⾔的编译器。2. 1991年2⽉&#xff1a;第⼀个Python解释器诞⽣&#xff0c;它是⽤C语⾔实现的&…

STM32之点亮LED灯

使用固件库实现LED点灯 LED灯&#xff1a; LED灯&#xff0c;是一种能够将电能转化为可见光的半导体器件 控制LED灯&#xff1a; LED灯的正极接到了3.3V&#xff0c;LED灯的负极接到了PA1&#xff0c;也就是GPIOA1引脚 只需要控制PA1为相对应的低电平&#xff0c;即可点亮对…

政务大数据解决方案(十)

政务大数据解决方案通过建立全面的集成数据平台&#xff0c;整合来自各政府部门的异构数据&#xff0c;运用大数据分析、人工智能和机器学习技术对数据进行深度挖掘与智能化处理&#xff0c;提供实时精准的决策支持&#xff0c;从而提升政策制定和实施的科学性与效率。该方案包…

retrofit+livedata+viewModel+moshi处理数据

1.从源码角度看&#xff0c;只需要定义一个CallAdapterFactory 处理结果livedata接受默认的CallAdapterFactory 是DefaultCallAdapterFactory // // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) //package retrofit2;i…

那不勒斯足球俱乐部在 The Sandbox 中启动

访问 The Sandbox 中的那不勒斯足球俱乐部快闪商店&#xff0c;赢取比赛门票和签名商品。 我们很高兴地宣布&#xff0c;我们将与意大利著名职业足球俱乐部那不勒斯足球俱乐部展开合作&#xff0c;在 4 个 UGC 体验中开设 “快闪商店”。在这个以传奇球队为灵感来源的独特数字…

[Meachines] [Medium] poison LFI+日志投毒+VNC权限提升

信息收集 IP AddressOpening Ports10.10.10.84TCP:22,80 $ nmap -p- 10.10.10.84 --min-rate 1000 -sC -sV 22/tcp open ssh OpenSSH 7.2 (FreeBSD 20161230; protocol 2.0) | ssh-hostkey: | 2048 e3:3b:7d:3c:8f:4b:8c:f9:cd:7f:d2:3a:ce:2d:ff:bb (RSA) | 256 …