首页 > 其他分享 >Wpf基础入门——容器Panel篇

Wpf基础入门——容器Panel篇

时间:2023-05-26 20:56:20浏览次数:50  
标签:控件 Canvas 元素 入门 布局 DockPanel Wpf 属性 Panel

WPF布局基础

WPF的布局原则

  • 一个窗口中只能包含一个元素
  • 不应显示设置元素尺寸
  • 不应使用坐标设置元素的位置
  • 可以嵌套布局容器

WPF有哪些布局容器?

  • Grid:网格。可以自定义行和列并通过行列的数量、行高和列宽来调整控件的布局。近似于HTML中的Table。
  • StackPanel:栈式面板。可将包含的元素在竖直或水平方向上排成一条直线,当移除一个元素后,后面的元素会自动向前移动以填充空缺。
  • Canvas:画布。内部元素可以使用以像素为单位的绝对坐标进行定位,类似于WindowsForm编程的布局方式。
  • DockPanel:泊靠式面板。内部元素可以选择泊靠方向,类似于在 Windows Form编程中设置控件的 Dock属性。
  • WrapPanel:自动折行面板。内部元素在排满一行后能够自动折行,类似于HTML中的流式布局。

布局容器详解

Grid

Grid的特点如下:

  • 可以定义任意数晁的行和列, 非常灵活。
  • 行的高度和列的宽度可以使用绝对数值、相对比例或自动调整的方式进行精确设定,并可设置最大和最小值。
  • 内部元素可以设置自己的所在的行和列, 还可以设置自己纵向跨几行、横向跨儿列。
  • 可以设置Children 元素的对齐方向。

基于这些特点, Grid适用的场合有:

  • UI布局的大框架设计。
  • 大量UI元素需要成行或者成列对齐的情况。
  • UI整体尺寸改变时, 元素需要保持固有的高度和宽度比例。
  • UI后期可能有较大变更或扩展。

StackPanel

StackPanel可以把内部元素在纵向或横向上紧凑排列、形成栈式布局,通俗地讲就是把内部元素像垒积木一样“撂起来”。垒积木大家都玩过,当把排在前面的积木块抽掉之后排在它后面的元素会整体向前移动、补占原有元素的空间

注意:在容器的可用尺寸内放置有限个元素,元素的尺寸总和(长/高)不允许超过StackPanel的尺寸, 否则超出的部分不可见。

基于这个特点,StackPanel适合的场合有:

  • 同类元素需要紧凑排列(如制作菜单或者列表)。
  • 移除其中的元素后能够自动补缺的布局或者动画。

StackPanel的三个属性:

  1. Orientation
  2. HorizontalAlignment
  3. VerticalAlignment

Canvas

Canvas译成中文就是“画布”,显然,在Canvas里布局就像在画布上画控件一样。使用Canvas布局与在Windows Form窗体上布局基本上是一样的,当控件被放置在Canvas里时就会被附加上 Canvas.X和 Canvas.Y属性。

Canvas很容易被从Windows Form迁移过来的程序员所滥用,实际上大多数时候我们都可以使用Grid或StackPanel等布局元素产生更简洁的布局。

想要显露盖在下面的元素,可以在代码中修改上面元素的 Visibility属性值或Opacity属性值。

Canvas适用的场合包括:平时很少使用

  • 一经设计基本上不会再有改动的小型布局(如图标)。
  • 艺术性比较强的布局。
  • 需要大量使用横纵坐标进行绝对点定位的布局。
  • 依赖于横纵坐标的动画。

DockPanel

DockPanel内的元素会被附加上 DockPanel.Dock这个属性,这个属性可取Left、Top、Right和 Bottom 四个值。根据Dock属性值,DockPanel内的元素会向指定方向累积、切分DockPanel 内部的剩余可用空间,就像船舶靠岸一样。

DockPanel还有一个重要属性——bool类型的LastChildFill,它的默认值是True。当LastChildFill属性的值为True时,DockPanel内最后一个元素的 DockPanel.Dock 属性值会被忽略,这个元素会把DockPanel内部所有剩余空间充满。这也正好解释了为什么Dock 枚举类型没有Fill 这个值。

WarpPanel

WrapPanel内部采用的是流式布局。WrapPanel使用Orientation属性来控制流延伸的方向,使用HorizontalAlignmentVerticalAlignment两个属性控制内部控件的对齐。

在流延伸的方向上,WrapPanel会排列尽可能多的控件,排不下的控件将会新起一行或一列继续排列

代码演示

项目源代码下载地址

image

    <!--Grid网格布局-->
    <Grid>
        <!--定义3行2列-->
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <!--为了方便演示,这里在第一个网格中重新定义Grid演示-->
        <Grid Grid.Row="0"
              Grid.Column="0">
            <!--这里面定义2行2列-->
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="2*" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="40" />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>

            <TextBlock Background="Red"
                       Grid.Row="0"
                       Grid.Column="0" />
            <TextBlock Background="Blue"
                       Grid.Row="0"
                       Grid.Column="1" />
            <TextBlock Background="Green"
                       Grid.Row="1"
                       Grid.ColumnSpan="2" />
        </Grid>

        <!--StackPanel演示-->
        <StackPanel Grid.Row="0"
                    Grid.Column="1">
            <TextBlock Background="AliceBlue"
                       HorizontalAlignment="Center"
                       Width="100" />
            <TextBlock Background="Aqua"
                       HorizontalAlignment="Left"
                       Width="100" />
            <TextBlock Background="AliceBlue"
                       HorizontalAlignment="Right"
                       Width="100" />
            <TextBlock Background="Aqua"
                       HorizontalAlignment="Stretch"
                       Width="200" />
            <TextBlock Background="Red"
                       VerticalAlignment="Stretch" />
            <TextBlock Background="Aqua" />
            <TextBlock Background="AliceBlue" />
            <TextBlock Background="Aqua" />
            <TextBlock Background="AliceBlue" />
            <TextBlock Background="Aqua" />
            <TextBlock Background="AliceBlue" />
            <TextBlock Background="Yellow" />
        </StackPanel>

        <!--Canvas布局演示-->
        <Canvas Grid.Row="1"
                Grid.Column="0"
                Background="DarkGray">
            <TextBlock Text="用户名:"
                       Canvas.Left="85"
                       Canvas.Top="31" />
            <TextBlock Text="密码:"
                       Canvas.Left="85"
                       Canvas.Top="56"
                       HorizontalAlignment="Center"
                       VerticalAlignment="Top" />
            <TextBox Canvas.Left="149"
                     Canvas.Top="30"
                     HorizontalAlignment="Left"
                     VerticalAlignment="Center"
                     Width="173" />
            <TextBox Canvas.Left="149"
                     Canvas.Top="56"
                     HorizontalAlignment="Left"
                     VerticalAlignment="Center"
                     Width="173" />
            <Button Content="确定"
                    Canvas.Left="174"
                    Canvas.Top="94"
                    HorizontalAlignment="Left"
                    VerticalAlignment="Center"
                    Width="54" />
            <Button Content="清除"
                    Canvas.Left="260"
                    Canvas.Top="94"
                    HorizontalAlignment="Left"
                    VerticalAlignment="Center"
                    Width="54" />
        </Canvas>

        <!--DockPanel演示-->
        <DockPanel Grid.Row="1"
                   Grid.Column="1">
            <TextBlock DockPanel.Dock="Top"
                       Background="Orange" />
            <TextBlock DockPanel.Dock="Left"
                       Width="200"
                       Background="Yellow" />
            <TextBlock DockPanel.Dock="Right"
                       Background="Red" />
        </DockPanel>

        <!--WarpPanel演示-->
        <WrapPanel Grid.Row="2"
                   Grid.Column="0">
            <TextBlock Background="Red"
                       Width="300"
                       HorizontalAlignment="Center" />
            <TextBlock Background="Orange"
                       Width="300"
                       HorizontalAlignment="Right" />
            <TextBlock Background="Yellow"
                       Width="200" />
            <TextBlock Background="Green"
                       Width="200" />
            <TextBlock Background="Red"
                       Width="300" />
            <TextBlock Background="Orange"
                       Width="300" />
            <TextBlock Background="Yellow"
                       Width="200" />
            <TextBlock Background="Green"
                       Width="200" />
        </WrapPanel>
    </Grid>

标签:控件,Canvas,元素,入门,布局,DockPanel,Wpf,属性,Panel
From: https://www.cnblogs.com/swbna/p/17435780.html

相关文章

  • 【K8s入门推荐】K8s1.24版本部署全教程,轻松掌握技巧kubeadm丨Kubernetes丨容器编排丨
    通过kubeadm方式极速部署Kubernetes1.24版本前言在Kubernetes的搭建过程中,繁琐的手动操作和复杂的配置往往会成为制约部署效率的关键因素。而使用kubeadm工具可以避免这些问题,大大提高集群的部署效率和部署质量。本文将为大家详细介绍如何使用kubeadm工具快速搭建Kubernetes1.24......
  • Linux入门篇之环境搭建
    前言对于Linux的初学者来说,云服务器是最好也是最方便的选择一、搭建Linux环境的方法1.裸机安装Linux操作系统,不推荐2.虚拟机安装Linux操作系统,不推荐3.云服务器安装,推荐二、白嫖使用云服务器云服务器的安装平台有很多,例如腾讯云,阿里云等,我们可以直接进入对应平台官网进行下载但是,有......
  • 企业内容管理入门指南:从概念到实践,提升协作效率和质量
    在现代企业管理中,存在一种容易被忽视但又极为重要的管理理念——企业内容管理。由于“企业内容”这一概念过于抽象,大家对它可能还比较模糊。所以,今天我们来聊聊企业内容管理。在开始之前,对企业内容做一个简明的介绍:企业内容是合同、发票、设计图纸、研发文件、项目文件、物流文件、......
  • 【2023最新】超详细图文保姆级教程:App开发新手入门(6)
    9.编译正式版 本章我们简单介绍一下如何设置应用的桌面图标及应用的启动页 通过之前章节的学习,我们已经完成了一个简单应用的开发,本部分章节主要目的是为本系列教程进行一个整体性的收尾,简介讲解一下如何编译一个可用于上架应用市场的正式版安装包。(本章内容超级简单......
  • HDU 2084 数塔(动态规划入门)
    传送门中文题就不给大家翻译了(手动滑稽),反正大家都看得懂。这是一道动态规划入门的题目,只需要找出状态转移方程即可。状态方程:dp[i][j]=a[i][j]+max(dp[i+1][j],dp[i+1][j])(dp[i][j]表示从第i层第j个数开始搜能得到的最大数)代码如下:#include<cstring>#include<iostream>#include<......
  • 【2023最新】超详细图文保姆级教程:App开发新手入门(2)
    上章节我们已经成功的创建了一个App项目,接下来我们讲述一下,如何导入项目、编辑代码和提交项目代码。 Let’sGo! 4.项目导入 当用户创建一个新的应用时,YonStudio开发工具会自动导入模板项目的默认代码,不需要手动进行代码导入。那么当我们不是创建应用,而是需要导入一个已经存......
  • 【2023最新】超详细图文保姆级教程:App开发新手入门(3)
    上文回顾,我们已经完成了一个应用项目创建、导入、代码更新、代码同步和代码提交,本章继续我们的新手开发之旅,讲述一下如何将开发完成的应用进行编译,生成可供他人安装、可上架的应用安装包。6应用打包 应用打包,简单来说就是将编写的代码,通过工具的打包编译机制,打包编译生成对应的手......
  • 【2023最新】超详细图文保姆级教程:App开发新手入门(4)
    之前章节我们已经完成了一个应用项目的导入、代码更新和代码提交和应用打包编译,本章继续讲述一下,如何在开发过程中进行代码的同步联机调试。7代码真机调试7.1纯静态CSS页面样式查看代码调试有多种方式,如果是查看纯粹的静态样式,可以使用浏览器打开对应页面(html或stml文件),或者直接......
  • 【2023最新】超详细图文保姆级教程:App开发新手入门(5)
    上文回顾,我们已经完成了一个应用的真机调试,本章我们来了解一下如何引入YonBuilder移动开发的(原生)移动插件,并利用移动插件完成一个简单的视频播放器。8.「移动插件」的使用 8.1什么是「移动插件」? 用通俗的话来解释,YonBuilder移动开发内的「移动插件」,是指使用原生语言(androi......
  • 动力节点Docker实战入门教程(4)Docker容陈可人
    根据B站上动力节点的最新版Docker教程整理了学习笔记,持续更新中~4Docker容器4.1容器基础4.1.1容器启动流程通过dockerrun命令可以启动运行一个容器。该命令在执行时首先会在本地查找指定的镜像,如果找到了,则直接启动,否则会到镜像中心查找。如果镜像中心存在该镜像,则会下载到本地......