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控件。

相关推荐
哆啦A梦的口袋呀13 分钟前
基于Python学习《Head First设计模式》第七章 适配器和外观模式
python·学习·设计模式
恰薯条的屑海鸥16 分钟前
零基础在实践中学习网络安全-皮卡丘靶场(第十期-Over Permission 模块)
学习·安全·web安全·渗透测试·网络安全学习
东京老树根1 小时前
SAP学习笔记 - 开发27 - 前端Fiori开发 Routing and Navigation(路由和导航)
笔记·学习
阿阳微客7 小时前
Steam 搬砖项目深度拆解:从抵触到真香的转型之路
前端·笔记·学习·游戏
Chef_Chen12 小时前
从0开始学习R语言--Day18--分类变量关联性检验
学习
键盘敲没电12 小时前
【IOS】GCD学习
学习·ios·objective-c·xcode
Java Fans12 小时前
在WPF项目中集成Python:Python.NET深度实战指南
python·.net·wpf
海的诗篇_13 小时前
前端开发面试题总结-JavaScript篇(一)
开发语言·前端·javascript·学习·面试
AgilityBaby13 小时前
UE5 2D角色PaperZD插件动画状态机学习笔记
笔记·学习·ue5
AgilityBaby13 小时前
UE5 创建2D角色帧动画学习笔记
笔记·学习·ue5