WPF学习(2)-UniformGrid控件(均分布局)+StackPanel控件(栈式布局)

UniformGrid控件(均分布局)

UniformGrid和Grid有些相似,只不过UniformGrid的每个单元格面积都是相等的,不管是横向的单元格,或是纵向的单元格,它们会平分整个UniformGrid。

UniformGrid控件提供了3个属性,分别是FirstColumn、Columns 、Rows 。FirstColumn表示第一行要空几个单元格,后面两个属性分别用于设置行数和列数。

1. 默认情况

这是我们没有UniformGrid的属性的效果,它会根据子元素的数量和UniformGrid自身的尺寸来决定行数和列数。

bash 复制代码
    <UniformGrid>
        <Button Content="1" Margin="2"/>
        <Button Content="2" Margin="2"/>
        <Button Content="3" Margin="2"/>
        <Button Content="4" Margin="2"/>
    </UniformGrid>

2. 设置参数

设计当前UniformGrid为3行3列,同时设置第一行第一个单元格保持空白。

bash 复制代码
    <UniformGrid FirstColumn="1" Rows="3" Columns="3">
        <Button Content="1" Margin="2"/>
        <Button Content="2" Margin="2"/>
        <Button Content="3" Margin="2"/>
        <Button Content="4" Margin="2"/>
    </UniformGrid>

3. 总结

UniformGrid控件使用非常简单方便,通常用于局部的布局。

StackPanel控件(栈式布局)

StackPanel用于水平或垂直堆叠子元素。也就是说,StackPanel同样也有一个Children属性,而Children集合中的元素呈现在界面上时,只能是按水平或垂直方式布局。

bash 复制代码
public class StackPanel : Panel, IScrollInfo, IStackMeasure
{
    public static readonly DependencyProperty OrientationProperty;
 
    public StackPanel();
 
    public double HorizontalOffset { get; }
    public double ViewportHeight { get; }
    public double ViewportWidth { get; }
    public double ExtentHeight { get; }
    public double ExtentWidth { get; }
    public bool CanVerticallyScroll { get; set; }
    public bool CanHorizontallyScroll { get; set; }
    public Orientation Orientation { get; set; }
    public double VerticalOffset { get; }
    public ScrollViewer ScrollOwner { get; set; }
    protected internal override Orientation LogicalOrientation { get; }
    protected internal override bool HasLogicalOrientation { get; }
 
    public void LineDown();
    public void LineLeft();
    public void LineRight();
    public void LineUp();
    public Rect MakeVisible(Visual visual, Rect rectangle);
    public void MouseWheelDown();
    public void MouseWheelLeft();
    public void MouseWheelRight();
    public void MouseWheelUp();
    public void PageDown();
    public void PageLeft();
    public void PageRight();
    public void PageUp();
    public void SetHorizontalOffset(double offset);
    public void SetVerticalOffset(double offset);
    protected override Size ArrangeOverride(Size arrangeSize);
    protected override Size MeasureOverride(Size constraint);
 
}

StackPanel提供了一些属性和方法,最常用的是Orientation枚举属性,用于设置子控件在StackPanel内部的排列方式,分别是水平排列(Horizontal)和垂直排列(Vertical)。默认值是垂直排列(Vertical)。

1. 垂直排列

bash 复制代码
    <StackPanel Orientation="Vertical">
        <Button Content="1" Margin="20" />
        <Button Content="2" Margin="20" />
        <Button Content="3" Margin="20" />
        <Button Content="4" Margin="20" />
    </StackPanel>

注意:
当StackPanel子元素处于垂直排列时,此时子元素的宽度默认与StakcPanel的宽度保持一致,但是子元素的高度是与其自身的高度自适应显示。

2. 水平排列

bash 复制代码
    <StackPanel Orientation="Horizontal">
        <Button Content="1" Margin="20" />
        <Button Content="2" Margin="20" />
        <Button Content="3" Margin="20" />
        <Button Content="4" Margin="20" />
    </StackPanel>

注意:
当StackPanel子元素处于水平排列时,此时子元素的高度默认与StakcPanel的高度保持一致,但是子元素的宽度是与其自身的宽度自适应显示。

3. StackPanel控件复杂使用

可以利用子控件的HorizontalAlignment属性或VerticalAlignment来设置子控件在StackPanel内部的显示位置,比如在垂直排列布局模式下,可以设置HorizontalAlignment属性值,Left表示显示在左则,Right显示在右则,Center则居中显示,Stretch表示拉伸填充显示。

需要注意的是,由于WPF的控件布局都是采用自适应计算每个控件的位置,所以在设置了HorizontalAlignment或VerticalAlignment后,子控件的宽度和高度都会重新计算,主要是根据自身内容的尺寸计算。

bash 复制代码
<ScrollViewer>
        <StackPanel Orientation="Vertical">
            <Button Content="1" Margin="20" HorizontalAlignment="Left"/>
            <Button Content="2" Margin="20" HorizontalAlignment="Right"/>
            <Button Content="3" Margin="20" HorizontalAlignment="Center"/>
            <Button Content="4" Margin="20" HorizontalAlignment="Stretch"/>
            <Button Content="5" Margin="20" />
            <Button Content="6" Margin="20" />
            <Button Content="7" Margin="20" />
            <Button Content="8" Margin="20" />
            <Button Content="9" Margin="20" />
        </StackPanel>
    </ScrollViewer>

我们可以看到上图中前三行的按钮都是根据自身内容的宽高自适应绘制的。另外,如果StackPanel内部的子控件太多,则需要配合滚动条容器ScrollViewer控件。

相关推荐
lingggggaaaa4 分钟前
小迪安全v2023学习笔记(一百四十五讲)—— Webshell篇&魔改冰蝎&打乱特征指纹&新增加密协议&过后门查杀&过流量识别
笔记·学习·安全·魔改冰蝎·免杀对抗·免杀技术
落羽的落羽38 分钟前
【C++】现代C++的新特性constexpr,及其在C++14、C++17、C++20中的进化
linux·c++·人工智能·学习·机器学习·c++20·c++40周年
小苏兮1 小时前
【把Linux“聊”明白】编译器gcc/g++与调试器gdb/cgdb:从编译原理到高效调试
java·linux·运维·学习·1024程序员节
im_AMBER1 小时前
React 11 登录页项目框架搭建
前端·学习·react.js·前端框架
py有趣8 小时前
LeetCode算法学习之两数之和 II - 输入有序数组
学习·算法·leetcode
BreezeJuvenile9 小时前
外设模块学习(15)——MQ-2烟雾气体传感器(STM32)
stm32·单片机·学习·mq-2·烟雾气体传感器
XH1.11 小时前
学习RT-thread(RT-thread定时器)
stm32·单片机·学习
2301_7965125212 小时前
Rust编程学习 - 为什么说Cow 代表的是Copy-On-Write, 即“写时复制技术”,它是一种高效的 资源管理手段
java·学习·rust
故里213012 小时前
学习前端记录(二)21-40
学习
ThreeYear_s12 小时前
电力电子技术学习路径与FPGA/DSP技术结合方向(gemini生成)
学习·fpga开发