WPF 面板布局常用方法_wpf columnspan_InspireW的博客-程序员秘密

技术标签: c#  WPF学习笔记  


总览

核心布局面板

名称 描述
StackPanel 在水平或垂直的堆栈中放置元素。这个布局容器通常用于更大、更复杂窗口中的一些小区域
WrapPanel 在一系列可换行的行中放置元素。在水平方向上, WrapPanel面板从左向右放置条目,然后在随后的行中放置元素。在垂直方向上, WrapPanel面板在自上而下的列中放置元素,并使用附加的列放置剩余的条目
DockPanel 根据容器的整个边界调整元素
Grid 根据不可见的表格在行和列中排列元素,这是最灵活、最常用的容器之一
UniformGrid 在不可见但是强制所有单元格具有相同尺寸的表中放置元素,这个布局容器不常用
Canvas 使用固定坐标绝对定位元素。这个布局容器与传统 Windows窗体应用程序最相似,但没有提供锚定或停靠功能。因此,对于尺寸可变的窗口,该布局容器不是合适的选择。如果选择的话,需要另外一些工作

一、StackPanel

  1. 默认情况下,Stack Panel面板按自上而下的顺序排列元素,使每个元素的高度适合它的内容
  2. 通过设置 Orientation属性,改变排列顺序(默认为:Vertical)
<Grid>
	<StackPanel>
		<Label HorizontalAlignment="Center">A Button Stack</Label>
		<Button HorizontalAlignment="Left">Left Button</Button>
		<Button HorizontalAlignment="Right">Right Button</Button>
		<Button>Right Button</Button>
	</StackPanel>
</Grid>

执行结果:
运行结果

二、WrapPanel

  1. WrapPanel面板在可能的空间中,以一次一行或一列的方式布置控件。
  2. 通过设置 Orientation属性,改变排列顺序(默认为:Horizontal)
<Grid>
	<WrapPanel>
		<Button Width="80" Height="30" >Button-01</Button>
		<Button Width="80" Height="60" >Button-01</Button>
		<Button Width="80" Height="30" >Button-01</Button>
		<Button Width="80" Height="30" >Button-01</Button>
		<Button Width="80" Height="30" >Button-01</Button>
	</WrapPanel>
</Grid>

执行结果:
在这里插入图片描述 在这里插入图片描述

三、DockPanel

  1. DockPanel 沿着一条外边缘来拉伸所包含的控件。
  2. 例如,如果将个按钮停靠在 Dockpanel面板的顶部,该按钮会被拉伸至 Dockpane面板的整个宽度,但根据内容和 Midheight属性为其设置所需的高度。而如果将一个按钮停靠到容器左边,该按钮的高度将被拉伸以适应容器的高度,而其宽度可以根据需要自由增加。
  3. 子元素是通过Dock附加属性来确定停靠的边,可将该属性设置为Left、Right、Top 或 Bottom。放在 DockPanel面板中的每个元素都会自动捕获该属性
  4. 先设置的控件优先靠边
<Grid>
	<DockPanel>
		<Button DockPanel.Dock="Top">Top Button</Button>
		<Button DockPanel.Dock="Bottom">Bottom Button</Button>
		<Button DockPanel.Dock="Left">Left Button</Button>
		<Button DockPanel.Dock="Right">Right Button</Button>
		<Button>Remaining space</Button>
	</DockPanel>
</Grid>

执行结果:
在这里插入图片描述

四、Grid

1 基础运用

  1. Grid面板也是将窗口分割成(可使用其他面板进行管理的)更小区域的理想工具。
  2. Grid面板通过使用对象填充 Grid Column Definitions和 Grid Row Definitions集合来创建网格和行。
  3. ShowGridLines 设置是否显示分割线
<Grid ShowGridLines="True">
 <Grid.RowDefinitions>
 	<RowDefinition />
 	<RowDefinition />
 </Grid.RowDefinitions>
 <Grid.ColumnDefinitions>
 	<ColumnDefinition />
 	<ColumnDefinition />
 </Grid.ColumnDefinitions>
 <Button Grid.Column="0" Grid.Row="0">Button-01</Button>
 <Button Grid.Column="1" Grid.Row="1">Button-02</Button>
</Grid>

执行结果:
在这里插入图片描述

2 调整行和列

<ColumnDefinition Width="100"/>		    <!-- 绝对尺寸 -->
<ColumnDefinition Width="Auto"/>	    <!-- 自动尺寸-->
<ColumnDefinition Width="80*"/>		<!-- 比例尺寸(带*前面的数为比例系数)-->

<!-- 如果希望不均匀地分割剩余空间,可指定权重,权重必须放在星号之前。-->
<!-- 例如,如果有两行是按比例设置尺寸,并希望第一行的高度是第二行高度的一半,-->
<!-- 那么可以使用如下设置来分配剩余空间-->
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="2*"/>

3 跨单元格

Row和 Column附加属性在单元格中放置元素。还可以使用另外两个附加属性使元素跨越多个单元格,这两个附加属性是 Rowspan和 Columnspan。这两个属性使用元素将会占有的行数和列数进行设置。

<Grid ShowGridLines="True">
  <Grid.RowDefinitions>
  	<RowDefinition Height="39*"/>
  	<RowDefinition Height="40*"/>
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
  	<ColumnDefinition Width="84*"/>
  	<ColumnDefinition Width="92*"/>
  	<ColumnDefinition Width="82*"/>
  	<ColumnDefinition Width="67*"/>
  	<ColumnDefinition Width="95*"/>
  </Grid.ColumnDefinitions>
  <Button Grid.Column="0" Grid.Row="0">Button-01</Button>
  <Button Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="2" >Button-02</Button>
  <Button Grid.Column="4" Grid.Row="0" Grid.RowSpan="2">Button-03</Button>
</Grid>

执行结果:
在这里插入图片描述

4 分割线 GridSplitter

原则:

  1. GridSplitter对象必须放在Grid单元格中,可与已经存在的内容一并放到单元格中,这时需要调整边距设置,使它们不相互重叠。更好的方法是预留一列或一行专门用于放置 Gridsplitter对象,并将预留行或列的 Heigh 或 Width属性的值设置为Auto;
  2. Gridsplitter对象总是改变整行或整列的尺寸(而非改变单个单元格的尺寸)。为使GridSplitter对象的外观和行为保持一致,需要拉伸 GridSplitter 对象使其穿越整行或整列,而不是将其限制在单元格中。为此,可使用前面介绍过的 RowSpan或 ColumnSpan属性。如下例子,Gridsplitter对象的 Rowspan属性被设置为2,因此被拉伸充满整列。如果不使用该设置, GridSplitter对象会显示在顶行(放置它的行)中,即使这样,拖动分割条时也会改变整列的尺寸
  3. 最初, GridSplitter对象很小不易看见。为了使其更可用,需要为其设置最小尺寸。对于竖直分割条需要将 VerticalAlignment 属性设置为Stretch(使分割条填满区域的整个高度),并将 Width设置为固定值(如10个设备无关单位)。对于水平分割条,需要设置 HorizontalAlignment 属性来拉伸,并将 Height属性设置为固定值
  4. GridSplitter对齐方式还决定了分割条是水平的(用于改变行的尺寸)还是竖直的(用于改变列的尺寸)。对于水平分割条,需要将 VerticalAlignment 属性设置为 Center(这也是默认值),以指明拖动分割条改变上面行和下面行的尺寸。对于竖直分割条(图3-15中显示的分割条),需要将 VerticalAlignment 属性设置为 Center,以改变分割条两侧列的尺寸。
  5. 在声明 GridSplitter对象时,将 ShowsPreview属性设置为fase。因此,当把分割条从一边拖到另一边时,会立即改变列的尺寸。但是如果将ShowsPreview属性设置为true,当拖动分割条时就会看到一个灰色的阴影跟随鼠标指针,用于显示将在何处进行分割。并且直到释放了鼠标键之后列的尺寸才改变。如果 GridSplitter对象获得了焦点,也可以使用箭头键改变相应的尺寸。
<Grid ShowGridLines="False">
	<Grid.RowDefinitions>
		<RowDefinition/>
		<RowDefinition/>
	</Grid.RowDefinitions>
	<Grid.ColumnDefinitions>
		<ColumnDefinition/>
		<ColumnDefinition Width="Auto"/>
		<ColumnDefinition/>
	</Grid.ColumnDefinitions>
	<Button Grid.Column="0" Grid.Row="0" Margin="3" Content="Button-01"/>
	<Button Grid.Column="0" Grid.Row="1" Margin="3" Content="Button-02"/>
	<Button Grid.Column="2" Grid.Row="0" Margin="3" Content="Button-03"/>
	<Button Grid.Column="2" Grid.Row="1" Margin="3" Content="Button-04"/>
	<GridSplitter Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" Width="3" VerticalAlignment="Stretch" HorizontalAlignment="Center" ShowsPreview="False"/>
</Grid>

执行结果:
在这里插入图片描述 在这里插入图片描述

5 共享尺度尺(待完善)

五、UniFormGrid 面板

有一种网格不遵循前面讨论的所有原则一 UniFormGrid面板。与Grid面板不同UniFormGrid面板不需要(甚至不支持)预先定义的列和行。相反,通过简单地设置Rows和Columns属性来设置其尺寸。每个单元格始终具有相同的大小,因为可用的空间被均分。最后,元素根据定义的顺序被放置到适当的单元格中。 Uniformgrid面板中没有Row和 Column附加属性,也没有空白单元格。

<Grid>
	<UniformGrid Rows="2" Columns="2">
		<Button >Button 01</Button>
		<Button >Button 02</Button>
		<Button >Button 03</Button>
		<Button >Button 04</Button>
	</UniformGrid>
</Grid>

执行结果:
在这里插入图片描述

六、Canvas

Canvas面板允许使用精确的坐标放置元素,如果设计数据驱动的富窗体和标准对话框,这并非好的选择;但如果需要构建其他些不同的内容(例如,为图形工具创建绘图表面), Canvas面板可能是个有用的工具。 Canvas面板还是最轻量级的布局容器。这是因为 Canvas面板没有包含任何复杂的布局逻辑,用以改变其子元素的首选尺寸。 Canvas面板只是在指定的位置放置其子元素,并且其子元素具有所希望的精确尺寸为在 Canvas面板中定位元素,需要设置 Canvas.Left和 Canvas.Top附加属性。 Canvas.Left属性设置元素左边和 Canvas面板左边之间的单位数, Canvas,Top属性设置子元素顶边和Canvas面板顶边之间的单位数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43680751/article/details/124274769

智能推荐

【Android -- UI 开发】Recyclerview 的通用分隔线_android recyclerview 分割线_Kevin-Dev的博客-程序员秘密

ItemDecoration 是 RecyclerView 的一个抽象静态内部类,负责装饰 Item 视图,例如添加间距、高亮或者分组边界等。

/etc/group文件详解_KXR的博客-程序员秘密

Linux /etc/group文件与/etc/passwd和/etc/shadow文件都是有关于系统管理员对用户和用户组管理时相关的文件。linux /etc/group文件是有关于系统管理员对用户和用户组管理的文件,linux用户组的所有信息都存放在/etc/group文件中。具有某种共同特征的用户集合起来就是用户组(Group)。用户组(Group)配置文件主要有 /etc/group和/e

从头开始编写操作系统(8) 第7章:系统结构_iteye_12523的博客-程序员秘密

从头开始编写操作系统(8) 第7章:系统结构 2011年04月17日    译自:http://www.brokenthorn.com/Resources/OSDev7.html 第7 章:系统结构   by Mike, 2008   本系列文章旨在向您展示并说明如何从头开发一个操作系统。 欢迎!在之前的一章里,我们总算完成了引导加载器的工作!到目前为止: 我们详细的了解了...

Java读取配置文件,xxx.class.getClassLoader().getResourceAsStream("");和xxx.class.getResourceAsStream("");的区别_糖果墙的博客-程序员秘密

Java读取配置文件,xxx.class.getClassLoader().getResourceAsStream("");和xxx.class.getResourceAsStream("");的区别一、需求说明:  有时候我们做项目,会遇到一个问题,就是我们在开发时候代码里面有很多路径到了部署的时候这些路径全部都要修改,有时候路径一多,自己难免也会忘记,本来代码就写了半天,结果到了部署的时候...

com.android.cts.devicepolicy.ManagedProfileTest -- testAppLinks_buggly的博客-程序员秘密

com.android.cts.devicepolicy.ManagedProfileTest – testAppLinksjunit.framework.AssertionFailedError at junit.framework.Assert.fail(Assert.java:48)10-11 11:56:14 I/BaseDevicePolicyTest: Test com.androi

ajax调用wcf rest服务器,PostMan 调用WCF Rest服务_美间的博客-程序员秘密

问题描述:现在有已有的WCF服务,但是ajax是不能请求到这个服务的;需要把WCF转成WCF REST 的风格。以下是从WCF转 WCF REST的步骤1.首先在接口定义的地方加上 请求WebInvoke http的请求动作如下:[OperationContract][WebInvoke(Method = "POST", UriTemplate = "Login", ResponseFormat ...

随便推点

DataInputStream源代码解读_光与热的博客-程序员秘密

DataInputStream是java IO装饰模式的一种实现,设计的目的是读取基本的java数据类型,需要强调的是DataInputStream也不是线程安全的,它继承了FilterInputStream抽象类,同时实现了DataInput接口,这个接口的主要作用是读取字节类型的数据并将数据重新构造为java的基本类型.对于DataInput接口如果在读取所需字节数据之前已经达到末尾,则会抛出...

PDFObject.js去掉下载和打印功能_pdfobject.js 禁止下载功能_x小墨的博客-程序员秘密

在这行代码加上style隐藏掉, c.innerHTML = ''; 加个 var isload = y.isload;属性判断是否显示, js实现: function OpenPDF(fileurl) {    var myPDF = new PDFObject({ url: fileurl,isload:false }).embed(); }

用 DolphinDB 和 Python Celery 搭建一个高性能因子计算平台_DolphinDB智臾科技的博客-程序员秘密

即时因子计算服务、大数据批计算服务、历史因子查询服务...尽在此因子计算平台~

OC高级编程iOS内存管理-第1章-自动引用计数_小凡几多的博客-程序员秘密

自动引用计数1.1 什么是自动引用计数 ARC和MRC的区别: MRC:(Manual Reference Counting)也就是非ARC,在Xcode4之前,Object_C的内存管理就需要开发人员手动维护。 ARC:(Automatic Reference Counting)也就是ARC,翻译成中文就是:【自动引用计数】,不需要开发人员手动维护,系统会在合适...

无法加载 DLL“SQLite.Interop.DLL”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。..._choujiabang1843的博客-程序员秘密

无法加载 DLL“SQLite.Interop.DLL”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。 在使用sqlite数据库的时候遇到的,这里做个总结; 在项目里添加 现有项 把SQLite.Interop.DLL文件添加进来,然后点击属性 修改一...

Verilog语法(不可综合)_writememh可以指定格式吗_一起拼,一起加油的博客-程序员秘密

1.只有寄存器类型变量才能在initial内部被赋值。 2.verilog系统任务 (1):finish/finish/finish/stop finish:如果遇到finish:如果遇到finish:如果遇到finish,仿真器完成仿真并退出。 stop:当遇到stop:当遇到stop:当遇到stop,仿真器停止仿真,但不退出,同时提供一个命令提示符,在命令提...