WPF基本布局基础

news/2025/2/25 6:28:17

一. Grid

  • 描述Grid 是WPF中最常用的布局容器之一。它允许你通过定义行和列来创建一个灵活的网格布局。子元素可以放置在特定的行和列中,并且可以跨越多行或多列。

  • 特点:

    • 支持行和列的定义,可以设置行高和列宽。

    • 支持子元素的绝对定位和相对定位。

    • 适合复杂的布局需求。

  • 常用属性RowDefinitionsColumnDefinitionsGrid.RowGrid.ColumnGrid.RowSpanGrid.ColumnSpan

作用:

  • RowDefinitions 和 ColumnDefinitions: 定义 Grid 的行和列。

  • Grid.Row 和 Grid.Column: 指定子元素在 Grid 中的位置。

  • Grid.RowSpan 和 Grid.ColumnSpan: 指定子元素跨越的行数或列数。

示例:

    <Grid>
        <!-- 定义3行 -->
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/> <!-- 第一行高度为50 -->
            <RowDefinition Height="*"/>  <!-- 第二行高度为剩余空间 -->
            <RowDefinition Height="2*"/> <!-- 第三行高度为第二行的两倍 -->
        </Grid.RowDefinitions>

        <!-- 定义3列 -->
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100"/> <!-- 第一列宽度为100 -->
            <ColumnDefinition Width="*"/>   <!-- 第二列宽度为剩余空间 -->
            <ColumnDefinition Width="2*"/>  <!-- 第三列宽度为第二列的两倍 -->
        </Grid.ColumnDefinitions>

        <!-- 第一行第一列 -->
        <Border Background="Red" Grid.Row="0" Grid.Column="0" />

        <!-- 第一行第二列,跨越两列 -->
        <Border Background="Green" Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2"/>

        <!-- 第二行第一列,跨越两行 -->
        <Border Background="Yellow" Grid.Row="1" Grid.Column="0" Grid.RowSpan="2"/>

        <!-- 第二行第二列 -->
        <Border Background="Blue" Grid.Row="1" Grid.Column="1"/>

        <!-- 第三行第三列 -->
        <Border Background="Black" Grid.Row="2" Grid.Column="2"/>

结果:

二. StackPanel

  • 描述StackPanel 是一个简单的布局容器,它将子元素按照水平或垂直方向依次排列。

  • 特点:

    • 子元素按照顺序排列,不会自动换行。

    • 适合简单的线性布局。

  • 常用属性Orientation(决定排列方向,Horizontal 或 Vertical)。

作用:

  • Horizontal: 子元素从左到右水平排列。

  • Vertical: 子元素从上到下垂直排列

示例:

(1)水平排列 (Orientation="Horizontal")

当 Orientation 设置为 Horizontal 时,StackPanel 中的子元素会从左到右依次排列。

<StackPanel Orientation="Horizontal">
    <Button Content="Button 1" Width="80" Height="30"/>
    <Button Content="Button 2" Width="80" Height="30"/>
    <Button Content="Button 3" Width="80" Height="30"/>
</StackPanel>

结果:

示例:

(2) 垂直排列 (Orientation="Vertical")

当 Orientation 设置为 Vertical 时,StackPanel 中的子元素会从上到下依次排列。

<StackPanel Orientation="Vertical">
    <Button Content="Button 1" Width="80" Height="30"/>
    <Button Content="Button 2" Width="80" Height="30"/>
    <Button Content="Button 3" Width="80" Height="30"/>
</StackPanel>

结果:

示例:

(3)动态切换排列方向

可以通过绑定或代码动态改变 Orientation 的值,从而实现排列方向的动态切换。

 xaml:

<StackPanel>
    <StackPanel Grid.Row="0" Grid.Column="0" x:Name="stackPanel" Orientation="Horizontal" >
        <Button Content="Button 1" Width="80" Height="30"/>
        <Button Content="Button 2" Width="80" Height="30"/>
        <Button Content="Button 3" Width="80" Height="30"/>
    </StackPanel>
        <Button  Content="转换" Click="ToggleOrientation" Margin="10"/>
</StackPanel>

C#:

 private void ToggleOrientation(object sender, RoutedEventArgs e)
 {
     if (stackPanel.Orientation == Orientation.Horizontal)
     {
         stackPanel.Orientation = Orientation.Vertical;
     }
     else
     {
         stackPanel.Orientation = Orientation.Horizontal;
     }
 }

结果:

 三.  DockPanel

  • 描述DockPanel 允许子元素停靠在容器的边缘(上、下、左、右)或填充剩余空间。

  • 特点:

    • 子元素可以通过 DockPanel.Dock 属性指定停靠位置。

    • 最后一个子元素可以填充剩余空间。

    • 适合需要将控件停靠在窗口边缘的布局。

  • 常用属性DockPanel.Dock

示例:

(1)DockPanel 可以用于创建复杂的布局,例如带有标题栏、工具栏、状态栏和内容区域的窗口布局。

    <DockPanel>
        <!-- 标题栏 -->
        <Border DockPanel.Dock="Top" Background="LightBlue" Height="30">
            <TextBlock Text="标题栏" VerticalAlignment="Center" HorizontalAlignment="Center"/>
        </Border>

        <!-- 工具栏 -->
        <Border DockPanel.Dock="Top" Background="LightGreen" Height="30">
            <TextBlock Text="工具栏" VerticalAlignment="Center" HorizontalAlignment="Center"/>
        </Border>

        <!-- 状态栏 -->
        <Border DockPanel.Dock="Bottom" Background="LightCoral" Height="30">
            <TextBlock Text="状态栏" VerticalAlignment="Center" HorizontalAlignment="Center"/>
        </Border>

        <!-- 侧边栏 -->
        <Border DockPanel.Dock="Left" Background="LightYellow" Width="100">
            <TextBlock Text="侧边栏" VerticalAlignment="Center" HorizontalAlignment="Center"/>
        </Border>

        <!-- 内容区域 -->
        <Border Background="LightGray">
            <TextBlock Text="内容区域" VerticalAlignment="Center" HorizontalAlignment="Center"/>
        </Border>
    </DockPanel>

结果:

(2) DockPanel.Dock 将子元素停靠在不同的位置,并通过代码动态调整子元素的停靠位置。

    <StackPanel>
        <DockPanel x:Name="dockPanel">
            <Button Content="顶部" DockPanel.Dock="Top" Height="50" Background="LightBlue"/>
            <Button Content="底部" DockPanel.Dock="Bottom" Height="50" Background="LightGreen"/>
            <Button Content="左边" DockPanel.Dock="Left" Width="100" Background="LightCoral"/>
            <Button Content="右边" DockPanel.Dock="Right" Width="100" Background="LightYellow"/>
            <Button Content="全充" Background="LightGray"/>
        </DockPanel>

        <Button Content="切换 Dock" Click="ToggleDock" Margin="10" Height="80" Width="150"/>
    </StackPanel>
        // 切换停靠位置的事件处理函数
        private void ToggleDock(object sender, RoutedEventArgs e)
        {
            var button = dockPanel.Children[0] as Button;
            if (button != null)
            {
                if (DockPanel.GetDock(button) == Dock.Top)
                {
                    DockPanel.SetDock(button, Dock.Bottom);
                }
                else
                {
                    DockPanel.SetDock(button, Dock.Top);
                }
            }
        }

 四. WrapPanel

  • 描述WrapPanel 将子元素按顺序排列,当空间不足时自动换行。

  • 特点:

    • 子元素按水平或垂直方向排列,并在空间不足时自动换行。

    • 适合需要自动换行的布局。

  • 常用属性Orientation(决定排列方向,Horizontal 或 Vertical)。

示例:

(1)水平排列 (Orientation="Horizontal")

<WrapPanel Orientation="Horizontal">
    <Button Content="Button 1" Width="100" Height="30" Margin="5"/>
    <Button Content="Button 2" Width="100" Height="30" Margin="5"/>
    <Button Content="Button 3" Width="100" Height="30" Margin="5"/>
    <Button Content="Button 4" Width="100" Height="30" Margin="5"/>
    <Button Content="Button 5" Width="100" Height="30" Margin="5"/>
    <Button Content="Button 6" Width="100" Height="30" Margin="5"/>
</WrapPanel>

结果:

(2)垂直排列 (Orientation="Vertical")

    <WrapPanel Orientation="Vertical" Margin="0,0,100,260">
        <Button Content="Button 1" Width="100" Height="30" Margin="5"/>
        <Button Content="Button 2" Width="100" Height="30" Margin="5"/>
        <Button Content="Button 3" Width="100" Height="30" Margin="5"/>
        <Button Content="Button 4" Width="100" Height="30" Margin="5"/>
        <Button Content="Button 5" Width="100" Height="30" Margin="5"/>
        <Button Content="Button 6" Width="100" Height="30" Margin="5"/>
    </WrapPanel>

 结果:

(3)动态切换排列方向

    <StackPanel>
        <!-- WrapPanel 用于演示排列方向 -->
        <WrapPanel x:Name="wrapPanel" Orientation="Horizontal" Margin="10">
            <Button Content="Button 1" Width="100" Height="30" Margin="5"/>
            <Button Content="Button 2" Width="100" Height="30" Margin="5"/>
            <Button Content="Button 3" Width="100" Height="30" Margin="5"/>
            <Button Content="Button 4" Width="100" Height="30" Margin="5"/>
            <Button Content="Button 5" Width="100" Height="30" Margin="5"/>
            <Button Content="Button 6" Width="100" Height="30" Margin="5"/>
        </WrapPanel>

        <!-- 切换排列方向的按钮 -->
        <Button Content="切换排列方向" Click="ToggleOrientation" Margin="10"/>
    </StackPanel>
        private void ToggleOrientation(object sender, RoutedEventArgs e)
        {
            if (wrapPanel.Orientation == Orientation.Horizontal)
            {
                wrapPanel.Orientation = Orientation.Vertical;
            }
            else
            {
                wrapPanel.Orientation = Orientation.Horizontal;
            }
        }

 结果:

五. Canvas

  • 描述Canvas是一个绝对定位的布局容器,子元素通过指定相对于Canvas左上角的坐标来定位。

  • 特点:

    • 子元素通过 Canvas.LeftCanvas.TopCanvas.RightCanvas.Bottom 属性进行绝对定位。

    • 适合需要精确控制元素位置的布局。

  • 常用属性Canvas.LeftCanvas.TopCanvas.RightCanvas.Bottom

示例:

Canvas.Left: 指定子元素左边缘与 Canvas 左边缘的距离。

Canvas.Top: 指定子元素上边缘与 Canvas 上边缘的距离。

Canvas.Right: 指定子元素右边缘与 Canvas 右边缘的距离。

Canvas.Bottom: 指定子元素下边缘与 Canvas 下边缘的距离。

这些属性可以单独使用,也可以组合使用,以实现精确的定位。

    <Canvas Width="300" Height="200" Background="LightGray" Margin="150,122,150,123">
        <!-- 定位左上角从 (0, 0) 开始 -->
        <Button Content="Button 1" Canvas.Left="0" Canvas.Top="0" Width="80" Height="30"/>

        <!-- 定位左上角从 中心点(150, 100) 开始 -->
        <Button Content="Button 2" Canvas.Left="150" Canvas.Top="100" Width="80" Height="30"/>
        
        <!-- 定位右下角从 (0, 0) 开始 -->
        <Button Content="Button 3" Canvas.Right="0" Canvas.Bottom="0" Width="80" Height="30"/>
    </Canvas>

结果:

六.  UniformGrid

  • 描述UniformGrid 是一个简单的网格布局容器,所有单元格的大小相同。

  • 特点:

    • 所有行和列的大小相同。

    • 适合需要均匀分布的布局。

  • 常用属性RowsColumns

示例:

(1)使用 Rows 和 Columns 定义一个 2 行 3 列的 UniformGrid

<UniformGrid Rows="2" Columns="3">
    <Button Content="Button 1"/>
    <Button Content="Button 2"/>
    <Button Content="Button 3"/>
    <Button Content="Button 4"/>
    <Button Content="Button 5"/>
    <Button Content="Button 6"/>
</UniformGrid>

结果:

(2)动态设置行数和列数

    <StackPanel>
        <!-- UniformGrid 用于演示布局 -->
        <UniformGrid x:Name="uniformGrid" Rows="2" Columns="3">
            <Button Content="Button 1"/>
            <Button Content="Button 2"/>
            <Button Content="Button 3"/>
            <Button Content="Button 4"/>
            <Button Content="Button 5"/>
            <Button Content="Button 6"/>
        </UniformGrid>

        <!-- 动态设置行数和列数的按钮 -->
        <Button Content="改变布局" Click="ChangeLayout" Margin="10"/>
    </StackPanel>
        private void ChangeLayout(object sender, RoutedEventArgs e)
        {
            if (uniformGrid.Rows == 2 && uniformGrid.Columns == 3)
            {
                uniformGrid.Rows = 3;
                uniformGrid.Columns = 2;
            }
            else
            {
                uniformGrid.Rows = 2;
                uniformGrid.Columns = 3;
            }
        }

结果:

 

(3)   结合其他布局容器

 UniformGrid 可以与其他布局容器(如 StackPanelDockPanel 等)结合使用,以实现更复杂的布局。

<DockPanel>
    <!-- 标题栏 -->
    <Border DockPanel.Dock="Top" Background="LightBlue" Height="30">
        <TextBlock Text="标题栏" VerticalAlignment="Center" HorizontalAlignment="Center"/>
    </Border>

    <!-- 内容区域 -->
    <UniformGrid Rows="2" Columns="2">
        <Button Content="Button 1"/>
        <Button Content="Button 2"/>
        <Button Content="Button 3"/>
        <Button Content="Button 4"/>
    </UniformGrid>
</DockPanel>

结果:


http://www.niftyadmin.cn/n/5865089.html

相关文章

《Effective Objective-C》阅读笔记(上)

目录 高质量iOS之熟悉OC 了解OC语言的起源 在类的头文件中尽量少引入其他头文件 多用字面语法&#xff0c;少用与之等价的方法 字面数值 字面量数组 字面量字典 局限性 多用类型常量&#xff0c;少用#define预处理指令 用枚举表示状态、选项、状态码 高质量iOS之对象…

explorer.exe句柄表的结构和前三个句柄对应的对象--重要

explorer.exe句柄表的结构和前三个句柄对应的对象 第二部分&#xff1a; 0: kd> !handle PROCESS 89589d88 SessionId: 0 Cid: 00e4 Peb: 7ffdf000 ParentCid: 0464 DirBase: 784cf000 ObjectTable: e19ce678 HandleCount: 275. Image: explorer.exe Han…

Eclipse IDE 2025-03 最新版安装教程(官方下载+环境配置详解)

一、软件定位与特性 Eclipse IDE 是开源跨平台集成开发环境&#xff0c;支持 Java/C/Python/PHP 等 50 编程语言&#xff0c;其插件生态系统覆盖 Web 开发、大数据分析、嵌入式开发等场景5。2025-03 版本新增智能代码补全、实时性能分析等 AI 增强功能。 二、安装环境准备 1. …

VScode 开发

目录 安装 VS Code 创建一个 Python 代码文件 安装 VS Code VSCode&#xff08;全称&#xff1a;Visual Studio Code&#xff09;是一款由微软开发且跨平台的免费源代码编辑器&#xff0c;VSCode 开发环境非常简单易用。 VSCode 安装也很简单&#xff0c;打开官网 Visual S…

【Linux-网络】从逻辑寻址到物理传输:解构IP协议与ARP协议的跨层协作

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长&#xff0c;行则将至 目录 &#x1f4da;前言 &#x1f4d6; IP地址的组成 &#x1f516;IPv4 &#x1f516;IPv6 &#x1f4da…

【深度学习】矩阵的核心问题解析

一、基础问题 1. 如何实现两个矩阵的乘法&#xff1f; 问题描述&#xff1a;给定两个矩阵 A A A和 B B B&#xff0c;编写代码实现矩阵乘法。 解法&#xff1a; 使用三重循环实现标准矩阵乘法。 或者使用 NumPy 的 dot 方法进行高效计算。 def matrix_multiply(A, B):m, n …

Spring Boot 3 整合 Spring Cloud Gateway 工程实践

引子 当前微服务架构已成为中大型系统的标配&#xff0c;但在享受拆分带来的敏捷性时&#xff0c;流量治理与安全管控的复杂度也呈指数级上升。因此&#xff0c;我们需要构建微服务网关来为系统“保驾护航”。本文将会通过一个项目&#xff08;核心模块包含 鉴权服务、文件服务…

Node.js 文件操作教程

Node.js 文件操作教程 1. 文件系统模块介绍 Node.js提供了fs&#xff08;File System&#xff09;模块来处理文件操作。这是一个内置模块&#xff0c;不需要额外安装。使用前&#xff0c;需要先引入&#xff1a; const fs require(fs); // 或使用 Promise API const fsProm…