首页 > 编程语言 >C# WPF入门学习主线篇(十六)—— Grid布局容器

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

时间:2024-06-09 15:58:35浏览次数:26  
标签:控件 C# 布局 Add Grid new WPF dynamicGrid

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,开发者可以实现复杂且灵活的用户界面布局,非常适合需要精确控制控件位置和大小的布局需求。接下来,我们将继续探讨其他布局容器及其应用。

标签:控件,C#,布局,Add,Grid,new,WPF,dynamicGrid
From: https://blog.csdn.net/weixin_56595425/article/details/139562719

相关文章

  • sqli-labs 靶场 less-1、2、3、4 第一关至第四关: 判断闭合方式,order by判断字段数,是否
    SQLi-Labs是一个用于学习和练习SQL注入漏洞的开源应用程序。通过它,我们可以学习如何识别和利用不同类型的SQL注入漏洞,并了解如何修复和防范这些漏洞。Less1SQLIDUMBSERIES-11.判断闭合方式:在参数后面加\的方法判断闭合,\后面的符号就是闭合符号。在第一关,闭合方式通......
  • java小记-scanner
    不想打字也是我的罪过吗?作业2:老师的代码:结果我的代码看起来冗余:想说的:我的本意是以为scanner只能记录一个数,然后就想着输入两次就能算两个数了,但没想到人家只是让你输就完了。不要管那么多。而且和值只是输出打印就可以了,不需要另外存储,只是当它如果要用在某个地方......
  • BUUCTF-WEB(71-75)
    [watevrCTF-2019]CookieStore打开购买flag那个cookie抓包,有个session值得注意我们拿去cyberchef解密一下然后我们试试改一下{"money":200,"history":[]}eyJtb25leSI6IDIwMCwgImhpc3RvcnkiOiBbXX0=然后发送响应包返回了一个session,我们解密一下就得到flag[红明谷C......
  • ctfshow
    1.crypto2用6种符号来编写代码:(、)、+、[、]、!,用JSFuck编码  2.crypto3 类似这种ω゚ノ=/`m´)ノ~┻━┻//*´∇`*/['_'];o=(゚ー゚)=_=3;c=(゚Θ゚)=(゚ー゚)-(゚ー゚);(゚Д゚)=(゚Θ゚)=(o^_^o)/(o^_^o);(゚Д゚)={゚Θ゚:'_',゚ω゚ノ:((゚ω゚ノ==3)+'_')[゚Θ゚]用这些符号来写代码的,用AA......
  • AtCoder Beginner Contest 357
    ABC357总结AtCoderBeginnerContest357A-SanitizeHands翻译有一瓶消毒剂,正好可以消毒\(M\)双手。\(N\)名外星人陆续前来消毒双手。\(i\)个外星人(\(1\leqi\leqN\))有\(H_i\)只手,想把所有的手都消毒一次。请计算有多少个外星人可以给所有的手消毒。在这里,即......
  • 华为od-C卷100分题目-3用连续自然数之和来表达整数
    华为od-C卷100分题目-3用连续自然数之和来表达整数题目描述一个整数可以由连续的自然数之和来表示给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式输入描述一个目标整数T(1<=T<=1000)输出描述该整数的所有表达式和表达式的个数。如果有多种表......
  • vivado HW_DEVICE
    硬件设备描述在VivadoDesignSuite的硬件管理器功能中,每个硬件目标都可以具有一个或多个XilinxFPGA设备进行编程或用于调试目的。这个hw_device对象是通过hw_server打开的hw_target上的物理部分。这个current_hw_device命令指定或返回当前设备。相关对象硬件设备与硬......
  • 基于OpenCV的SIFT算法实现图像拼接(全景图像)
    一、SIFT算法尺度不变特征转换(Scale-invariantfeaturetransform或SIFT)是一种机器视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变数,此算法由DavidLowe在1999年所发表,2004年完善总结。SIFT算法的实质是在不同的尺度......
  • Linux会像Windows一样把64个CPU核心分成一组吗
    Linux与Windows在处理器管理上存在一些差异,但两者都不会直接将64个CPU核心简单地分成一组。不过,它们都会使用各种策略和技术来优化处理器的使用,这包括如何分配进程到不同的CPU核心。Linux作为一种开源的操作系统,其内核可以运行在多种不同的硬件架构上,包括x86、ARM、PowerPC等......
  • c++的无限cmd病毒
    1.简单介绍c++的windows.h库里有很多老师不告诉你的函数,有一个函数叫MessageBox,用法如下MessageBox(...,"...","...",...);比如MessageBox(0,"点赞吧","提示",0);效果如下 还有一个函数,跟MessageBox差不多,叫MessageBoxA,使用方法为MessageBoxA(...,"...","..."......