五. Grid

Grid顾名思义就是“网格”,它的子控件被放在一个一个实现定义好的小格子里面,整齐配列。 Grid和其他各个Panel比较起来,功能最多也最为复杂。要使用Grid,首先要向RowDefinitions和ColumnDefinitions属性中添加一定数量的RowDefinitions和 ColumnDefinitions元素,从而定义行数和列数。而放置在Grid面板中的控件元素都必须显示采用附加属性语法定义其 放置所在的行和列,它们都是以0为基准的整型 值,如果没有显式设置任何行或列,Grid将会隐式地将控件加入在第0行第0列。由于Grid的组成并非简单的添加属性标记来区分行列,这也使得用户在实际应用中可以具体到某一单 元格中,所以布局起来就很精细了。

Grid的单元格可以是空的,一个单元格中可以有多个元素,而在单元格中元素是根据它们的Z顺序一个接着一个呈现的。与Canvas一样,同一个单元格中 的子元素不会与其他元素交互布局,信息——它们仅仅是重叠而已。接下来我们来使用一些实际的代码演示一下如何使用GRID。

1) Grid的列宽与行高可采用固定、自动、按比列三种方式定义

<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="40" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="300" />
</Grid.ColumnDefinitions>
</Grid>

注意:这里介绍一下Grid高度、宽度的几种定义方式:

名称

说明

绝对尺寸

就是给一个实际的数字,但通常将此值指定为整数,像上图中中那样

自动(Autosizing)

值为Auto,实际作用就是取实际控件所需的最小值

StarSizing

值为*或N*,实际作用就是取尽可能大的值,当某一列或行被定义为*则是尽可能大,当出现多列或行被定义为*则是代表几者之间按比例方设置尺寸

第一种,固定长度——宽度不够,会裁剪,不好用。单位pixel。 
第二种,自动长度——自动匹配列中最长元素的宽度。 
第三种,比例长度——*表示占用剩余的全部宽度;两行都是*,将平分剩余宽度;像上面的一个2*,一个*,表示前者2/3宽度。

2) 跨越多行和多列

<Rectangle Fill="Silver" Grid.Column="1" Grid.ColumnSpan="3"/> 

使用Grid.ColumnSpan和Grid.RowSpan附加属性可以让相互间隔的行列合并,所以元素也可以跨越多个单元格。

3) 使用GridSplit分割

<GridSplitter Height="6" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
Grid.Row="2" Grid.Column="2"></GridSplitter>

使用GridSplit控件结合Grid控件实现类似于WinForm中SplitContainer的功能,这个大家在WinForm当中经常用到,我们也不多做介绍。

4) XAML代码实现下图效果(用XAML):

<Window x:Class="WpfApp1.WindowGridDemo"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="WindowGridDemo" Height="300" Width="400">

    <Grid>

        <Grid.RowDefinitions>

            <RowDefinition Height="61*"/>

            <RowDefinition Height="101*"/>

            <RowDefinition Height="108*"/>

        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>

            <ColumnDefinition Width="139"/>

            <ColumnDefinition Width="184*"/>

            <ColumnDefinition Width="45*" />

            <ColumnDefinition Width="250*"/>

        </Grid.ColumnDefinitions>

        <TextBlock   Grid.Row="0" Grid.ColumnSpan="1"  Text="第一行,第一列,占1列" Background="Red" HorizontalAlignment="Center"  />

        <Button Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="3" Grid.RowSpan="2" Content="从第1行第2列开始,占两行,三列" />

        <Button  Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="4" Content="第3行,第1列开始,占4列" />

        <Button Grid.Row="1" Name="btnAddByCode" Click="btnAddByCode_Click" >后台代码生成(第2行第1列)</Button>

    </Grid>

</Window>

5)  下图,以C#代码实现:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Shapes;

namespace WpfApp1

{

    /// <summary>

    /// WindowGridDemo.xaml 的交互逻辑

    /// </summary>

    public partial class WindowGridDemo : Window

    {

        public WindowGridDemo()

        {

            InitializeComponent();

        }

        public void btnAddByCode_Click(object sender, RoutedEventArgs e)

        {

            Grid grid = new Grid();

            grid.Width = Double.NaN;    //相当于在XAML中设置Width="Auto"

            grid.Height = Double.NaN;   //相当于在XAML中设置Height="Auto"

            //把grid添加为窗体的子控件

            this.Content = grid;

            //列一

            ColumnDefinition cd1 = new ColumnDefinition();

            cd1.Width = new GridLength();

            grid.ColumnDefinitions.Add(cd1);

            //列二

            ColumnDefinition cd2 = new ColumnDefinition();

            cd2.Width = new GridLength(, GridUnitType.Star);

            grid.ColumnDefinitions.Add(cd2);

            //列三

            ColumnDefinition cd3 = new ColumnDefinition();

            cd3.Width = new GridLength(, GridUnitType.Star);

            grid.ColumnDefinitions.Add(cd3);

            //行一

            RowDefinition row1 = new RowDefinition();

            row1.Height = new GridLength();

            grid.RowDefinitions.Add(row1);

            //行二

            RowDefinition row2 = new RowDefinition();

            row2.Height = new GridLength(, GridUnitType.Star);

            grid.RowDefinitions.Add(row2);

            //行三

            RowDefinition row3 = new RowDefinition();

            row3.Height = new GridLength();

            grid.RowDefinitions.Add(row3);

            //把单元格添加到grid中

            Rectangle r0c1 = new Rectangle();

            r0c1.Fill = new SolidColorBrush(Colors.Gray);

            r0c1.SetValue(Grid.ColumnProperty, );

            r0c1.SetValue(Grid.RowProperty, );

            grid.Children.Add(r0c1);

            Rectangle r1c23 = new Rectangle();

            r1c23.Fill = new SolidColorBrush(Colors.Yellow);

            r1c23.SetValue(Grid.ColumnProperty, );

            r1c23.SetValue(Grid.ColumnSpanProperty, );

            r1c23.SetValue(Grid.RowProperty, );

            r1c23.SetValue(Grid.RowSpanProperty, );

            grid.Children.Add(r1c23);

        }

    }

}

六、 UniformGrid 

介绍了前面的Grid,接下来介绍的这个UniformGrid 就是Grid的简化版,每个单元格的大小相同,不需要定义行列集合。每个单元格始终具有相同的大小,每个单元格只能容纳一个控件,将自动按照定义在其内部的元素个数,自动创建行列,并通常保持相同的行列数。UniformGrid 中没有Row 和Column 附加属性,也没有空白单元格。

与Grid布局控件相比,UniformGrid布局控件很少使用。Grid面板是用于创建简单乃至复杂窗口布局的通用工具。UniformGrid面板是一个一种更特殊的布局容器,主要用于在一个刻板的网格中快速地布局元素。

下面用XAML代码实现一个示例,该示例使用4个按钮填充UniformGrid面板。:

<Window x:Class="WpfApp1.WindowUniformGrid"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="WindowUniformGrid" Height="300" Width="300">

    <Grid>

        <UniformGrid Rows="2" Columns="2">

            <Button>第一个(0,0)</Button>

            <Button>第二个(0,1)</Button>

            <Button>第三个(1,0)</Button>

            <Button Name="btnAddByCode" Click="btnAddByCode_Click">第四个(1,1)</Button>

        </UniformGrid>

    </Grid>

</Window>

下面使用C#代码实现10个TextBlock的控件的布局。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Controls.Primitives;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Shapes;

namespace WpfApp1

{

    /// <summary>

    /// WindowUniformGrid.xaml 的交互逻辑

    /// </summary>

    public partial class WindowUniformGrid : Window

    {

        public WindowUniformGrid()

        {

            InitializeComponent();

        }

        public void btnAddByCode_Click(object sender, RoutedEventArgs e)

        {

            UniformGrid wp = new UniformGrid();

            //把wp添加为窗体的子控件

            this.Content = wp;

            wp.Margin = new Thickness(, , , );

            wp.Background = new SolidColorBrush(Colors.Red);

            //遍历增加Rectangles

            TextBlock block;

            for (int i = ; i <= ; i++)

            {

                block = new TextBlock();

                block.Text = string.Format("第{0}个", i);

                wp.Children.Add(block);

            }

        }

    }

}

WPF入门教程系列八——布局之Grid与UniformGrid(三)的更多相关文章

  1. WPF入门教程系列六——布局介绍与Canvas(一)

    从这篇文章开始是对WPF中的界面如何布局做一个较简单的介绍,大家都知道:UI是做好一个软件很重要的因素,如果没有一个漂亮的UI,功能做的再好也无法吸引很多用户使用,而且没有漂亮的界面,那么普通用户会感 ...

  2. WPF入门教程系列九——布局之DockPanel与ViewBox(四)

    七. DockPanel DockPanel定义一个区域,在此区域中,您可以使子元素通过描点的形式排列,这些对象位于 Children 属性中.停靠面板其实就是在WinForm类似于Dock属性的元 ...

  3. WPF入门教程系列十——布局之Border与ViewBox(五)

    九. Border Border 是一个装饰的控件,此控件绘制边框及背景,在 Border 中只能有一个子控件,若要显示多个子控件,需要将一个附加的 Panel 控件放置在父 Border 中.然后可 ...

  4. WPF入门教程系列七——布局之WrapPanel与StackPanel(二)

    三. WrapPanel WrapPanel布局面板将各个控件从左至右按照行或列的顺序罗列,当长度或高度不够是就会自动调整进行换行,后续排序按照从上至下或从右至左的顺序进行. Orientation— ...

  5. WPF入门教程系列二十三——DataGrid示例(三)

    DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...

  6. WPF入门教程系列(一) 创建你的第一个WPF项目

    WPF入门教程系列(一) 创建你的第一个WPF项目 WPF基础知识 快速学习绝不是从零学起的,良好的基础是快速入手的关键,下面先为大家摞列以下自己总结的学习WPF的几点基础知识: 1) C#基础语法知 ...

  7. WPF入门教程系列(二) 深入剖析WPF Binding的使用方法

    WPF入门教程系列(二) 深入剖析WPF Binding的使用方法 同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProp ...

  8. WPF入门教程系列三——Application介绍(续)

    接上文WPF入门教程系列二——Application介绍,我们继续来学习Application 三.WPF应用程序的关闭 WPF应用程序的关闭只有在应用程序的 Shutdown 方法被调用时,应用程序 ...

  9. WPF入门教程系列二——Application介绍

    一.Application介绍 WPF和WinForm 很相似, WPF与WinForm一样有一个 Application对象来进行一些全局的行为和操作,并且每个 Domain (应用程序域)中仅且只 ...

随机推荐

  1. 快手 KSCAD 5.0 矢量图形设计软件

    今天我的快手软件发布了一个最新版本 KSCAD 5.0,免费使用, 详情请看 www.timegis.com 快手 5.0 (KSCAD) 是一款简单易用的矢量绘图软件,其功能和Visio类似,可以绘 ...

  2. Spring学习笔记 6. 尚硅谷_佟刚_Spring_Bean 之间的关系

    1,继承关系 首先从简单的代码来看,有一个Address类,配置文件有两个bean (1)Address类 package com.zsq; public class Address { privat ...

  3. Oracle 服务手动启动关闭

    在windows7中安装完Oracle11g之后会出现一下七种服务:可通过运行->services.msc查看. 其中各个服务名称中的ORCL或orcl为SID即System IDentifie ...

  4. 汇总常用的jQuery操作Table tr td方法

    虽然现在DIV+CSS进行页的布局大行其道,但是很多地方使用table还是有很多优势,用table展示数据是比较方便的,下面汇总了jQuery操作Table tr td常用的方法,熟记这些操作技巧,下 ...

  5. Windows Phone 8.1 新特性 - 页面导航

    本篇介绍一下Windows Phone 8.1 中页面导航的实现方式. 大家对Windows Phone 8 中页面导航的实现一定不陌生,我们使用 NavigationService 来实现.具体写法 ...

  6. Vue.js多重组件嵌套

    Vue.js多重组件嵌套 Vue.js中提供了非常棒的组件化思想,组件提高了代码的复用性.今天我们来实现一个形如 <app> <app-header></app-head ...

  7. SQL Server 2008 R2 下移动数据库的存储位置

    使用场景:1. 该数据库增长的较大,存储磁盘空间不足:   2. 在特定情况下该数据库需要移动到另外一块磁盘上(呵呵...我的情况就是之前的磁盘要还给别人) 步骤: 1. 新建查询 SELECT na ...

  8. 本人讲课时录制的Android应用开发技术教学视频

    网盘地址:http://yun.baidu.com/pcloud/album/info?query_uk=1963923831&album_id=3523786484935252365 本人讲 ...

  9. php+redis window

    http://download.csdn.net/detail/qwfy326/6572443 wampserver2.2e-php5.3.13-httpd2.2.22-mysql5.5.24-x64

  10. SQL入门经典(三) 之连接查询

    上一篇介绍到查询.这一篇主要讲连接查询,将介绍INNER JOIN,OUTER JOIN(LEFT和RIGHT),FULL JOIN,CROSS JOIN. 连接顾名斯义就是把多个数据表数据合并到一个 ...