WPF之UI布局(一)

本文介绍了WPF中的四种主要布局:Grid(网格)、DockPanel(泊靠面板)、StackPanel(栈式面板)和WrapPanel(自动拆行面板)。Grid提供精细的行列布局,适用于复杂UI设计;DockPanel允许元素沿边缘停靠,适用于自适应布局;StackPanel将元素按行或列排列,适合作为菜单栏;WrapPanel则在空间不足时自动换行,类似HTML流式布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WPF之UI布局(一)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

开发工具与关键技术:Visual Studio 2015WPF

作者: 梁柏源

撰写时间:2020/12/11

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

在Wpf中是在XAML中布局的,在正式开始Wpf的UI布局之前,我们还需了解布局的几种格式,在Wpf的UI布局里一共有四大布局,分别为Grid(网格)、DockPanel(泊靠面板)、StackPanel(栈式面板)以及WrapPanel(自动拆行面板)(环绕面板)。其中数Grid(网格)、DockPanel(泊靠面板)比较常见。

  • Grid网格

Grid:网格。可以自定义行和列并通过行列的数量、行高列宽来调整控件的布局。近似Html中的table。 

Grid顾名思义就是“网格”,它的子控件被放在一个一个实现定义好的小格子里面,整齐配列。Grid和其他各个Panel比较起来,功能最多也最为复杂。

要使用Grid,首先要向RowDefinitions和ColumnDefinitions属性中添加一定数量的RowDefinitions和 ColumnDefinitions元素,从而定义行数和列数。 而放置在Grid面板中的控件元素都必须显示采用附加属性语法定义其 放置所在的行和列,它们都是以0为基准的整型值,如果没有显式设置任何行或 列,Grid将会隐式地将控件加入在第0行第0列。 由于Grid的组成并非简单的添加属性标记来区分行列,这也使得用户在实际应用中可以具体到某一单 元格中,所以布局起来就很精细了。   

RowDefinitions:定义行,里面包含RowDefinition,多少个RowDefinition就有多少行。

ColDefinitions:定义列,里面包含ColDefinition,多少个ColDefinition就有多少列。

特点:

可以定义任意数量的行和列,非常灵活。

行的高度和列的宽度可以使用绝对值、相对比例或自动调整的方式进行精确设定,并可以设置最大和最小值。 

内部元素可以设置自己所在的行和列,还可以设置自己纵向跨几行,横向跨几列。

定义行列需要用到Grid.Row和Grid.Column(比如:Grid.Row="1" Grid.Column="1",意思是第一行第一列)

可以设置Children元素的对齐方向。 基于以上这些特点,Grid的适用场合有:  UI布局的大框架设计。 大量UI元素需要成行或者成列对齐的情况。 UI尺寸改变的时候,元素需要保留固有的宽度和高度比列。

  • DockPanel:泊靠面板

DockPanel:泊靠式面板。内部元素可以选择泊靠的方向(上下左右),类似于Winform中设置控件的Dock属性。

DockPanel定义一个区域,在此区域中,您可以使子元素通过描点的形式排列,这些对象位于 Children 属性中。 停靠面板类似于WinForm中控件的Dock属性。DockPanel会对每个子元素进行排序,并将根据指定的边进行停靠,多个停靠在同侧的元素则按顺序排序。

在DockPanel中,指定停靠边的控件,会根据定义的顺序占领边角,所有控件绝不会交叠。      默认情况下,后添加的元素只能使用剩余空间,无论对DockPanel的最后一个子元素设置任何停靠值,该子元素都将始终填满剩余的空间。如果 不希望最后一个元素填充剩余区域,可以将DockPanel属性LastChildFill设置为false,还必须为最后一个子元素显式指定停靠方向。

DockPanel一般用于自适应的布局

  • StackPanel:栈式面板

StackPanel:栈式面板。可将包含的元素在水平或垂直方向排成一条线,当移除一个元素后,后面的元素会自动向前填充空缺。(菜单栏)

StackPanel就是将控件按照行或列来顺序排列,但不会换行。

通过设置面板的Orientation属性设置了两种排列方式:横排(Horizontal默认的)和竖排(Vertical)。

默认情况下垂直排序,水平排列时,每个元素都与面板一样高;垂直排列时,每个元素都与面板一样宽。如果包含的元素超过了面板空间,它只会截断多出的内元素的Margin属性用于使元素之间产生一定得间隔,当元素空间大于其内容的空间时,剩余空间将由HorizontalAlignment和 VerticalAlignment属性来决定。

StackPanel多用于同类元素需要紧凑排列(如制作菜单和列表)或移除其中的元素后能够自动补缺的布局或者动画。StackPanel 适合水平或者垂直方向的布局,在父容器中是右对齐的,然而再StackPanel容器中采用内容右对齐时,设置子控件的停靠方式时,不会起到任何作用,默认情况下,Stack的水平布局时,从左至右。修改了FlowDirection设置了StackPanel的方向后,所有的子控件,都是从右向左方向进行绘制和显示。所以对于StackPanel我们基本上是用上述的属性和对StackPanel的停靠方式进行设置后,即可满足布局的要求 

特点:每个元素各占一行或者一列

WrapPanel:自动拆行面板(环绕面板)

WrapPanel:自动折行面板。内部元素在排满一行后能够自动折行,类似于Html中的流式布局。

WrapPanel布局面板将各个控件从左至右按照行或列的顺序罗列,当长度或高度不够时就会自动调整进行换行,后续排序按照从上至下或从右至左的 顺序进行。

     Orientation——根据内容自动换行。当Orientation属性的值设置为 Horizontal:元素是从左向右排列的,然后自上至下自动换行。当Orientation属 性的值设置为Vertical:元素是从上向下排列的,然后从左至右自动换行。     ItemHeight——所有子元素都一致的高度。每个子元素填充高度的方式取决于它的VerticalAlignment属性、Height属性等。任何比ItemHeight高的 元素都将被截断。

    ItemWidth——所有子元素都一致的宽度。每个子元素填充高度的方式取决于它的VerticalAlignment属性、Width属性等。任何比ItemWidth高的元 素都将被截断。

  • Canvas:画布

Canvas:画布。内部元素可以使用以像素为单位的绝对坐标进行定位,类似于Windows Form 的布局方式。

 画布,用于完全控制每个元素的精确位置。他是布局控件中最为简单的一种,直接将元素放到指定位置,主要来布置图面。     使用Canvas,必须指定一个子元素的位置(相对于画布),否则所有元素都将出现在画布的左上角。调整位置用Left、Right、Top和Bottom四个 附加属性。

 如果Canvas是窗口主元素(即最外层的布局面板是Canvas),用户改变窗口大小时,Canvas也会随之变化,子元素的位置也会随之移动,以保证 相对于Canvas的位置属性不变。     Canvas允许子元素的部分或全部超过其边界,默认不会裁剪子元素,同时可以使用负坐标,即溢出的内容会显示在Canvas外面,这是因为默 认 ClipToBounds=False,因此画布不需要指定大小。如果想复制画布内容,将ClipToBounds设为true即可。

注意:说明一点Canvas内的子控件不能使用两个以上的Canvas附加属性,如果同时设置Canvas.Left和Canvas.Right属性,那么后者将会被忽略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值