百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

WPF基础之UI布局

zhezhongyun 2025-05-28 21:40 31 浏览

知识点:

WPF中的布局控件主要有以下几种:

StackPanel:栈面板,可以将元素排列成一行或者一列。其特点是:每个元素各占一行或者一列。

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

DockPanel:停靠面板,定义一个区域,在此区域中,您可以使子元素通过描点的形式排列,这些对象位于 Children 属性中。

Grid:网格面板, Grid顾名思义就是“网格”,以表格形式布局元素,对于整个面板上的元素进行布局,它的子控件被放在一个一个事先定义好的小格子里面,整齐配列。 Grid和其他各个Panel比较起来,功能最多也最为复杂。

Canvas:画布面板,画布,用于完全控制每个元素的精确位置。他是布局控件中最为简单的一种,直接将元素放到指定位置,主要来布置图面。

1、StackPanel

Orientation属性指定排列方式:

Vertical(垂直)【默认】,垂直排列时,每个元素都与面板一样宽。

Horizontal(水平),水平排列时,每个元素都与面板一样高;

如果包含的元素超过了面板空间,它只会截断多出的内容。 元素的Margin属性用于使元素之间产生一定得间隔,当元素空间大于其内容的空间时,剩余空间将由HorizontalAlignment和 VerticalAlignment属性来决定如何分配。

首先是【默认】垂直(Vertical)情况下的布局:

<Window
    x:Class="LayoutSample.StackPanelSample"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:LayoutSample"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="StackPanelSample"
    Width="800"
    Height="450"
    mc:Ignorable="d">
 
    <StackPanel Margin="5,5,5,5">
        <Button
            x:Name="button1"
            Margin="2,5,2,5"
            Content="按钮1" />
        <Button
            x:Name="button2"
            Margin="2,5,2,5"
            Content="按钮2" />
        <Button
            x:Name="button3"
            Margin="2,5,2,5"
            Content="按钮3" />
        <Button
            x:Name="button4"
            Margin="2,5,2,5"
            Content="按钮4" />
        <Button
            x:Name="button5"
            Margin="2,5,2,5"
            Content="按钮5" />
        <Button
            x:Name="button6"
            Margin="2,5,2,5"
            Content="按钮6" />
        <Button
            x:Name="button7"
            Margin="2,5,2,5"
            Content="按钮7" />
        <Button
            x:Name="button8"
            Margin="2,5,2,5"
            Content="按钮8" />
    </StackPanel>
</Window>

水平布局,示例代码,与垂直排列相同,只是多了一个Oriention属性:

  <StackPanel Margin="5,5,5,5" Orientation="Horizontal">

StackPanel其他常用属性:

HorizontalAlignment:水平对齐方式,值:Left,Center,Right,Stretch。

VerticalAlignment:垂直对齐方式,值:Bottom , Center,Stretch,Top。

Visibility:设置StackPanel是否可见,值:Visible,Hidden,Collapsed。

Background:设置背景颜色,值为Bursh类型的枚举值。

Width,Height,MinWidth,MinHeight,MaxWidth,MaxHeight:分别用来设置StackPanel的宽,高,最小宽,最小高,最大宽,最大高。

WrapPanel【环绕面板】:

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

水平排列:当Orientation属性的值设置为 Horizontal:元素是从左向右排列的,然后自上至下自动换行。

<Window
    x:Class="LayoutSample.WrapPanelSample"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:LayoutSample"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="WrapPanelSample"
    Width="400"
    Height="350"
    mc:Ignorable="d">
 
    <WrapPanel>
        <Button
            x:Name="button1"
            Margin="2,5,2,5"
            Content="按钮1" />
        <Button
            x:Name="button2"
            Margin="2,5,2,5"
            Content="按钮2" />
        <Button
            x:Name="button3"
            Margin="2,5,2,5"
            Content="按钮3" />
        <Button
            x:Name="button4"
            Margin="2,5,2,5"
            Content="按钮4" />
        <Button
            x:Name="button5"
            Margin="2,5,2,5"
            Content="按钮5" />
        <Button
            x:Name="button6"
            Margin="2,5,2,5"
            Content="按钮6" />
        <Button
            x:Name="button7"
            Margin="2,5,2,5"
            Content="按钮7" />
        <Button
            x:Name="button8"
            Margin="2,5,2,5"
            Content="按钮8" />
    </WrapPanel>
</Window>

垂直布局,示例代码,与水平排列相同,只是多了一个Oriention属性:

<WrapPanel Margin="5,5,5,5" Orientation="Vertical">

WrapPanel其他常用属性,除了StackPanel属性常用属性,还有两个,如下所示:

ItemHeight:所有的元素都相同高度。

ItemWidth:所有的元素都相同宽度。

DockPanel【停靠面板】:

停靠面板类似于WinForm中控件的Dock属性。DockPanel会对每个子元素进行排序,并将根据指定的边进行停靠,多个停靠在同侧的元素则按顺序排序。

默认情况下,所有子元素都是靠左停靠【DockPanel.Dock=Left】

<Window
    x:Class="LayoutSample.DockPanelSample"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:LayoutSample"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="DockPanelSample"
    Width="600"
    Height="450"
    mc:Ignorable="d">
 
    <DockPanel Margin="5,5,5,5">
        <Button
            x:Name="button1"
            Margin="2,5,2,5"
            Content="按钮1"
            DockPanel.Dock="Left" />
        <Button
            x:Name="button2"
            Margin="2,5,2,5"
            Content="按钮2"
            DockPanel.Dock="Top" />
        <Button
            x:Name="button3"
            Margin="2,5,2,5"
            Content="按钮3"
            DockPanel.Dock="Right" />
        <Button
            x:Name="button4"
            Margin="2,5,2,5"
            Content="按钮4"
            DockPanel.Dock="Bottom" />
        <Button
            x:Name="button5"
            Margin="2,5,2,5"
            Content="按钮5"
            DockPanel.Dock="Left" />
        <Button
            x:Name="button6"
            Margin="2,5,2,5"
            Content="按钮6"
            DockPanel.Dock="Top" />
        <Button
            x:Name="button7"
            Margin="2,5,2,5"
            Content="按钮7"
            DockPanel.Dock="Right" />
        <Button
            x:Name="button8"
            Margin="2,5,2,5"
            Content="按钮8"
            DockPanel.Dock="Bottom" />
        <Button
            x:Name="button9"
            Margin="2,5,2,5"
            Content="按钮9" />
    </DockPanel>
</Window>

DockPanel其他常用属性,除了StackPanel属性常用属性,还有一个,如下所示:

  1. LastChildFill:最后一个子元素,是否填充剩余空间,默认为True。

设置不顶边:

<DockPanel Margin="5,5,5,5" LastChildFill="False">

Grid【网格面板】:

以表格形式布局元素,对于整个面板上的元素进行布局,要使用Grid,首先要向RowDefinitions和ColumnDefinitions属性中添加一定数量的RowDefinitions和 ColumnDefinitions元素,从而定义行数和列数。

放置在Grid面板中的控件元素都必须显示采用Row和Column附加属性定义其放置所在的行和列,这两个属性的值都是从0开始的索引数,如果没有显式设置任何行或列,Grid将会隐式地将控件加入在第0行第0列。

默认情况下,如果不设置Grid面板的行列宽,与高,则默认均分,且如果不显示设置子元素的大小,则默认填充。

<Window
    x:Class="LayoutSample.GridSample"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:LayoutSample"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="GridSample"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Button
            x:Name="button1"
            Grid.Row="0"
            Grid.Column="0"
            Margin="2,5,2,5"
            Content="按钮1" />
        <Button
            x:Name="button2"
            Grid.Row="0"
            Grid.Column="1"
            Margin="2,5,2,5"
            Content="按钮2" />
        <Button
            x:Name="button3"
            Grid.Row="0"
            Grid.Column="2"
            Margin="2,5,2,5"
            Content="按钮3" />
        <Button
            x:Name="button4"
            Grid.Row="1"
            Grid.Column="0"
            Margin="2,5,2,5"
            Content="按钮4" />
        <Button
            x:Name="button5"
            Grid.Row="1"
            Grid.Column="1"
            Margin="2,5,2,5"
            Content="按钮5" />
        <Button
            x:Name="button6"
            Grid.Row="1"
            Grid.Column="2"
            Margin="2,5,2,5"
            Content="按钮6" />
        <Button
            x:Name="button7"
            Grid.Row="2"
            Grid.Column="0"
            Margin="2,5,2,5"
            Content="按钮7" />
        <Button
            x:Name="button8"
            Grid.Row="2"
            Grid.Column="1"
            Margin="2,5,2,5"
            Content="按钮8" />
        <Button
            x:Name="button9"
            Grid.Row="2"
            Grid.Column="2"
            Margin="2,5,2,5"
            Content="按钮9" />
    </Grid>
</Window>

列宽和行高,分别可以在ColumnDefinition、RowDefinition里面指定Width、Height的值。

设置宽与高的几种方式:

固定值:设置具体的数字,单位为像素px。

Auto:根据子元素的大小,自动分配大小,刚好能够容纳子元素的内容。

星号*:根据比例自动分配剩余空间。

Grid面板其他属性,除了StackPanel属性常用属性,还有两个:

Grid.ColumnSpan:用于设置元素跨越的单元格列数。

Grid.RowSpan:用于设置元素跨越的单元格行数。

Canvas【画布面板】:

画布,用于完全控制每个元素的精确位置。他是布局控件中最为简单的一种,直接将元素放到指定位置,主要来布置图面。

Canvas通过设置Left,Top,Bottom,Right等属性的值,来设置子元素的位置,如果同时设置Canvas.Left和Canvas.Right属性,那么后者将会被忽略

    <Canvas>
        <Button x:Name="button1" Margin="2 5 2 5" Content="按钮1" Canvas.Left="20" Canvas.Top="50"/>
    </Canvas>

Canvas的其他属性,除了StackPanel的常用属性外,还有两个属性:

  1. ClipToBounds:超出边界部分,是否需要进行剪裁。
  2. Panel.ZIndex:用于设置子元素在Z方向上的顺序,值越大,越靠上。如果两个元素重叠,则ZIndex值小的将会被覆盖。

相关推荐

HashMap详解(hashmap lru)

讲解步骤基础知识工作原理关键代码核心方法基础知识数组结构数组接口,在查询数据方面,具备优势链表结构链表结构,在增删数据方面,具备优势红黑树结构红黑树结构,在查询数据方面,数据量较大的时候,具备一定的优...

升级内核,UC浏览器电脑版v2.0.570.0下载

IT之家(www.ithome.com):升级内核,UC浏览器电脑版v2.0.570.0下载7月21日晚,UC浏览器电脑版发布了v2.0正式版,最新的版本号是2.0.570.0。此次更新的最大亮点是内...

MySQL惊天陷阱:left join时选on还是where?

前天写SQL时本想通过AleftBjoinonand后面的条件来使查出的两条记录变成一条,奈何发现还是有两条。后来发现joinonand不会过滤结果记录条数,只会根据and后的条...

一个高效使用cursor开发项目的方法,怎么让 AI 写的代码不跑题?

最近又用cursor做了一个小应用,番茄时钟,用来管理自己的时间,提高效率。然后使用cursor开发的过程中。有了一些新的感悟。找到了一条可以让Curosr不跑题的办法。生成一份详细的项目资...

某通信公司笔试题,你会做几道?(通信行业行测题)

笔试部分1.描述下面代码中两个static各自的含义:staticvoidfunc(void){staticunsignedinti;}参考答案:行1,static表示静态...

新手学Python避坑,学习效率狂飙! 二、Python 代码缩进

在Python里,缩进有着极其重要的作用,它被用于界定代码块。与其他多数编程语言使用大括号{}来划分代码块不同,Python依靠缩进来明确代码的层次结构。下面分享缩进问题,并且给出避坑的方法...

Python缩进规范详解与最佳实践(python缩进讲解)

Python的缩进规则是强制性的语法要求,绝对不能乱缩进!作为一门用缩进表示代码块的语言,Python的缩进错误会导致程序直接崩溃。以下是关于缩进规范的全面解析:一、Python缩进的底层逻辑代...

深度解析ConcurrentHashMap1.8源码分析

想必大家对HashMap数据结构并不陌生,JDK1.7采用的是数组+链表的方式,JDK1.8采用的是数组+链表+红黑树的方式。虽然JDK1.8对于HashMap有了很大的改进,提高了存取效率,但是线程...

星河战神暴风旋转刃好不好 暴风旋转刃属性详解

星河战神暴风旋转刃好不好?暴风旋转刃怎么得?小编为大家分享星河战神暴风旋转刃属性图鉴,希望可以帮助到大家。暴风旋转刃85级满级属性战力加成暴风旋转刃分类:僚机初始:1星属性:风满星:5星暴风旋...

假面骑士亚极陀全形态盘点(假面骑士亚极陀形态合集)

《假面骑士亚极陀》的形态设计延续了空我的属性差异化思路,但更强调“觉醒”与“进化”的主题。从基础形态的属性专精到闪耀形态的等离子爆发,每个形态都承载着角色成长与剧情转折。数据对比不仅揭示了力量...

膛线磨没了子弹精度到底是怎么受影响的呢?

这是一个回复:那么咱们就来深究这个问题吧——当膛线磨没了,子弹的精度到底是怎么受影响的呢?到底是不是就成了“滑膛枪”射程、精度是不是差了一点?先说结论——膛线磨没了,只能让这把枪成为“信仰之枪”,根本...

【莫莫老师亲授】公考行测图形推理3大属性规律!提分利器

在公务员考试的行测科目中,图形推理是高频考点之一,而属性规律作为基础题型中的核心模块,常通过图形的对称性、曲直性、开闭性三大属性考查考生的观察与归纳能力。本文将从定义、特点、常见考法及例题分析入手,系...

DNF驱魔属性合并,技能重做解读(dnf驱魔加强了吗)

作者:B蜀黍前言本轮职业平衡驱魔进行了力驱法驱合二为一,部分技能重做和技能优化。形态方面:新增四神系技能且可柔化,力系技能加快出手速度,一觉从1秒瞬发单段脱手改为3秒站桩多段,形态逆向优化,实战体验...

拉满一个3级配件?还是升6个2级配件,橙装升级最优解方案揭秘!

各位车长,试验型配件已经重新发放!即日起至3月31日,在这期间登录游戏就能免费领到6个试验型配件和700个合金原件(已领取的玩家不再重复获得)。今天就和各位车长简单聊一聊:活动期间一共能获得多少合金元...

CAD动态块制作方法—旋转动态块(cad动态块制作教程 视频教程)

CAD动态块制作方法—可见性动态块CAD动态块制作方法—拉伸动态块今天来讲一下含有旋转动作的动态块制作方法。我们用立面索引符号来举例。旋转动态块首先制作一个带有属性定义的立面索引符号的图块。(此步...