C# WPF入门学习主线篇(十六)—— Grid布局容器

C# WPF入门学习主线篇(十六)—— Grid布局容器

欢迎来到C# WPF入门学习系列的第十六篇。在前几篇文章中,我们已经探讨了 CanvasStackPanelWrapPanelDockPanel 布局容器及其使用方法。本篇博客将介绍另一种功能强大且灵活的布局容器——Grid。通过本文,您将学习如何使用 Grid 来创建复杂且灵活的用户界面布局,并了解 Grid 的常见属性和应用场景。

什么是Grid布局容器?

Grid 是WPF中最常用的布局容器之一,用于创建基于行和列的布局。Grid 允许开发者定义任意数量的行和列,并将子控件放置在这些行列的交点上。它非常适合用于创建复杂的用户界面布局,因为它提供了对控件位置和大小的精确控制。

Grid的常见属性

Grid 有几个重要的属性和附加属性,可以帮助开发者灵活地控制子控件的排列方式:

  • RowDefinitions: 定义 Grid 的行集合。
  • ColumnDefinitions: 定义 Grid 的列集合。
  • Grid.Row: 附加属性,指定子控件所在的行。
  • Grid.Column: 附加属性,指定子控件所在的列。
  • Grid.RowSpan: 附加属性,指定子控件跨越的行数。
  • Grid.ColumnSpan: 附加属性,指定子控件跨越的列数。

使用Grid布局容器的示例

基本使用示例

以下是一个简单的XAML代码示例,展示了如何使用 Grid 创建一个包含三行两列的布局:

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Grid Example" Height="350" Width="525">
    <Grid>
        <!-- 定义三行两列的 Grid 布局 -->
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <!-- 将控件放置在 Grid 的特定行和列中 -->
        <TextBlock Text="Label 1" Grid.Row="0" Grid.Column="0" Margin="5"/>
        <TextBox Grid.Row="0" Grid.Column="1" Margin="5"/>
        <TextBlock Text="Label 2" Grid.Row="1" Grid.Column="0" Margin="5"/>
        <TextBox Grid.Row="1" Grid.Column="1" Margin="5"/>
        <Button Content="Submit" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Margin="5" HorizontalAlignment="Center"/>
    </Grid>
</Window>

动态设置Grid的示例

在后台代码中,您可以动态设置或修改 Grid 的行和列定义,并添加子控件:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace WpfApp
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // 动态创建一个 Grid 并设置其属性
            Grid dynamicGrid = new Grid
            {
                Background = new SolidColorBrush(Colors.LightGray)
            };

            // 动态创建行和列定义
            dynamicGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Auto) });
            dynamicGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
            dynamicGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Auto) });

            dynamicGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Auto) });
            dynamicGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });

            // 动态创建控件并设置其 Grid 位置
            TextBlock label1 = new TextBlock { Text = "Dynamic Label 1", Margin = new Thickness(5) };
            Grid.SetRow(label1, 0);
            Grid.SetColumn(label1, 0);

            TextBox textBox1 = new TextBox { Margin = new Thickness(5) };
            Grid.SetRow(textBox1, 0);
            Grid.SetColumn(textBox1, 1);

            TextBlock label2 = new TextBlock { Text = "Dynamic Label 2", Margin = new Thickness(5) };
            Grid.SetRow(label2, 1);
            Grid.SetColumn(label2, 0);

            TextBox textBox2 = new TextBox { Margin = new Thickness(5) };
            Grid.SetRow(textBox2, 1);
            Grid.SetColumn(textBox2, 1);

            Button submitButton = new Button { Content = "Dynamic Submit", Margin = new Thickness(5), HorizontalAlignment = HorizontalAlignment.Center };
            Grid.SetRow(submitButton, 2);
            Grid.SetColumn(submitButton, 0);
            Grid.SetColumnSpan(submitButton, 2);

            // 将控件添加到 Grid
            dynamicGrid.Children.Add(label1);
            dynamicGrid.Children.Add(textBox1);
            dynamicGrid.Children.Add(label2);
            dynamicGrid.Children.Add(textBox2);
            dynamicGrid.Children.Add(submitButton);

            // 将动态创建的 Grid 添加到窗口的内容中
            this.Content = dynamicGrid;
        }
    }
}

在上面的代码中,我们动态创建了一个 Grid,设置其行和列定义,并添加了几个控件到该 Grid 中,最后将 Grid 添加到窗口的内容中。
在这里插入图片描述

Grid布局容器的优缺点

优点

  1. 灵活性高Grid 允许精确控制子控件的位置和大小,非常适合复杂的用户界面布局。
  2. 支持嵌套布局Grid 可以嵌套其他布局容器,实现更复杂的布局。
  3. 自动调整Grid 可以根据控件内容自动调整行和列的大小,提供更灵活的布局方案。

缺点

  1. 配置复杂:对于简单布局,Grid 的配置可能显得过于复杂,需要定义行和列,并指定每个控件的位置。
  2. 性能问题:在包含大量子控件或嵌套布局时,Grid 可能会导致性能问题,因为它需要动态计算控件的位置和大小。

总结

本文详细介绍了WPF中的 Grid 布局容器,包括其常见属性、使用方法及优缺点。通过 Grid,开发者可以实现复杂且灵活的用户界面布局,非常适合需要精确控制控件位置和大小的布局需求。接下来,我们将继续探讨其他布局容器及其应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/693611.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MT76X8 RF定频使用方法

一、从下面网址下载QA软件包&#xff0c;然后在WIN系统下安装QA环境。https://download.csdn.net/download/zhouwu_linux/89408573?spm1001.2014.3001.5503 在WINDOWS 7系统下先安装WinPcap_4_1_3.exe。 二、硬件连接。 模块上电&#xff0c;PC机 的IP配置成为10.10.18.100&a…

GraphQL(6):认证与中间件

下面用简单来讲述GraphQL的认证示例 1 实现代码 在代码中添加过滤器&#xff1a; 完整代码如下&#xff1a; const express require(express); const {buildSchema} require(graphql); const grapqlHTTP require(express-graphql).graphqlHTTP; // 定义schema&#xff0c;…

Wireshark TS | 应用传输丢包问题

问题背景 仍然是来自于朋友分享的一个案例&#xff0c;实际案例不难&#xff0c;原因也就是互联网线路丢包产生的重传问题。但从一开始只看到数据包截图的判断结果&#xff0c;和最后拿到实际数据包的分析结果&#xff0c;却不是一个结论&#xff0c;方向有点跑偏&#xff0c;…

微服务第一轮

课程文档 目录 一、业务流程 1、登录 Controller中的接口&#xff1a; Service中的实现impl&#xff1a; Service中的实现impl所继承的接口IService&#xff08;各种方法&#xff09;&#xff1a; VO&#xff1a; DTO&#xff1a; 2、搜索商品 ​Controller中的接口&a…

牛客热题:最长公共子串

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;最长公共子串题目链接方法一&am…

【Redis学习笔记05】Jedis客户端(中)

Jedis客户端 1. 命令 1.1 String类型 1.1.1 常见命令 SET命令 语法&#xff1a;SET key value [EX seconds | PX milliseconds] [NX|XX] 说明&#xff1a;将string类型的value值设置到指定key中&#xff0c;如果之前该key存在&#xff0c;则会覆盖原先的值&#xff0c;原先…

Java--可变参数

1.JDK1.5开始&#xff0c;Java支持同类型的可变参数给一个方法 2.在方法声明之前&#xff0c;在指定参数类型后加一个省略号&#xff08;...&#xff09; 3.一个方法只能指定一个可变参数&#xff0c;它必须是方法的最后一个参数&#xff0c;任何普通的参数必须在它之前声明 …

Java----抽象类和接口

欢迎大家来这次博客-----抽象类和接口。 1.抽象类 1.1 抽象类概念 在Java中我们都是通过类来描述对象&#xff0c;但反过来并不是所有的类都是用来描述对象的。当一个类中没有足够的信息来描述一个具体对象&#xff0c;我们就将该类称为抽象类。 如上图中的Shape类&#xff…

支付宝订单支付和超时收单

下订单成功后&#xff0c;发送mq消息到死信队列&#xff0c;消息过期后根据死信的路由key重新路由到交换机&#xff0c;交换机根据消息的路由key把消息路由到普通队列上&#xff0c;消费者监听队列并消费。 问题&#xff0c;现在提交订单信息调用支付宝的支付页面&#xff0c;…

AI论文速读 | 2024[ICML]FlashST:简单通用的流量预测提示微调框架

题目&#xff1a; FlashST: A Simple and Universal Prompt-Tuning Framework for Traffic Prediction 作者&#xff1a;Zhonghang Li, Lianghao Xia&#xff08;夏良昊&#xff09;, Yong Xu&#xff08;徐勇&#xff09;, Chao Huang 机构&#xff1a;华南理工大学&#xf…

分享不用会员免费听歌的软件,可听付费,支持随听随下!

今天来点特别的&#xff0c;给你们带来几款全网免费听歌的神器&#xff0c;让你们的音乐之旅不再有障碍&#xff01; 现在&#xff0c;找好听的歌越来越像寻宝一样&#xff0c;动不动就得掏腰包。不过别担心&#xff0c;阿星今天就来分享几款好用的免费听歌app&#xff0c;电脑…

SQL(一)基本语法

文章目录 一、Sql 语言基本特点二、数据查询&#xff08;按执行顺序排列&#xff09;1. From & Join2. Where3. Group by4. Having5. Select6. Distinct7. Order by8. Limit/ Offset 三、功能公式1. 字符处理2. 时间处理3. 统计计算 一、Sql 语言基本特点 不区分大小写分号…

数据库(29)——子查询

概念 SQL语句中嵌套SELECT语句&#xff0c;称为嵌套查询&#xff0c;又称子查询。 SELECT * FROM t1 WHERE column1 (SELECT column1 FROM t2); 子查询外部语句可以是INSERT/UPDATE/DELETE/SELECT的任何一个。 标量子查询 子查询返回的结果是单个值&#xff08;数字&#xff…

pdf压缩文件怎么压缩最小,软件工具压缩清晰

PDF格式的文件&#xff0c;当其体积过于庞大时&#xff0c;确实在上传的过程中显得尤为不便。今天给大家分享一个压缩pdf的简单的方法&#xff0c;让大家可以轻松的压缩pdf。 浏览器打开 "轻云处理pdf官网" &#xff0c;上传pdf文件&#xff0c;文件上传完成后网站会…

ChatGPT Prompt技术全攻略-精通篇:Prompt工程技术的高级应用

系列篇章&#x1f4a5; No.文章1ChatGPT Prompt技术全攻略-入门篇&#xff1a;AI提示工程基础2ChatGPT Prompt技术全攻略-进阶篇&#xff1a;深入Prompt工程技术3ChatGPT Prompt技术全攻略-高级篇&#xff1a;掌握高级Prompt工程技术4ChatGPT Prompt技术全攻略-应用篇&#xf…

计算机网络到底是指什么?

计算机网络是信息技术领域中最为核心和复杂的一部分&#xff0c;它涵盖了众多的技术原理和应用。下面&#xff0c;我们将从技术层面深入探讨计算机网络的相关内容。 一、计算机网络的分层模型 计算机网络的分层模型是网络通信的基石&#xff0c;它将网络通信过程划分为不同的层…

万能嗅探:视频号下载神器

万能嗅探是一款比较好用资源嗅探软件&#xff0c;界面干净&#xff0c;可以抓取浏览器的网页&#xff0c;不过想必各位主要用来抓取视频号&#xff0c;下面是使用方法。 使用方法 打开万能嗅探客户端&#xff0c;然后打开浏览器&#xff0c;产生网络请求即可&#xff0c;看看…

【Linux高级IO】select、poll、epoll

【Linux高级IO】select、poll、epoll toc 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2024.6.5 前言&#xff1a;本篇博客将会介绍面试重点考察的select、poll、epoll IO: input && Output read && write 应用层read&&write的时候&#xff0c…

PostgreSQL 17 Beta1 发布,酷克数据再次贡献核心力量

得益于全球的开发者贡献&#xff0c;PostgreSQL已成长为一款拥有众多全球用户和贡献者、成熟稳定的开源数据库。2024年5月23日&#xff0c;PostgreSQL全球开发组宣布&#xff0c;PostgreSQL 17的首个 Beta 版本现已开放下载。本次新版本带来了众多惊喜。值得一提的是&#xff0…

【云原生】基于windows环境搭建Docker

目录 一、Docker Desktop搭建 二、前置准备 2.1开启 Hyper-V 2.2 Hyper-V选项看不到问题解决 2.3 开启或升级wsl 三、安装过程 3.1 下载安装包 3.2 安装 Docker Desktop 3.2.1 Docker 图标一直处于starting状态问题解决 3.3 配置仓库与镜像 3.4 docker功能测试 四、…