Grid控件是WPF布局容器中功能最强大、最灵活的控件。Grid控件基本上能够完成其他WPF容器控件所能完成的功能,Microsoft建议大多数界面的布局都使用Grid控件来实现,因此默认情况下。vs会自动在XAML文件中添加

<Grid>元素的声明。

创建Grid控件

  创建一个基于Grid的布局需要两个步骤

  1.定义Grid控件的行和列,用于放置子元素。

  2.在为每个子元素指定Grid.Row和Grid.Column附加属性,将元素放置在合适的位置。

为了创建Grid的行列,需要使用Grid.ColumnDefinitions和Grid.RowDefinitions这两个集合属性。

下面创建一个GridDemo的WPF项目,来演示如何使用Grid控件添加行和列。

    <Grid ShowGridLines="True" >
<Grid.ColumnDefinitions>
<!--~定义3列-->
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<!--~定义3行-->
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions> </Grid>

注意:ShowGridLines只是为了便于调试Grid控件,最好不要用在发布的应用程序上面。

由于此处没有为ColumnDefinitions和RowDefinitions指定任何尺寸,因此默认情况下,Grid将会平均分配行列的宽度和高度。

调整行列尺寸

  ColumnDefinitions和RowDefinitions 分别定义了一个用于调整其尺寸的属性,可以从下图看到默认情况下,这两个属性都被指定了一个*号。对于ColumnDefinitions来说,主要是

设置其Width属性指定没一列的宽度,对于RowDefinitions主要是设置Heigt属性指定行的高度。与其他控件的尺寸设置不同的是,Grid控件支持如下3种尺寸设置策略。

  1绝对尺寸:指定精确的设备无关单位的大小。比如,想要让行指定为100个设备无关单位的高度,则可以使用如下的代码

  <RowDefinitions height="100" /> 

绝对尺寸在Grid中通常较少,因为一经指定,便不能根据内容大小的改变而灵活的伸缩。

  注意:如果确实需要指定某些控件的大小,可以使用Margin属性。该属性将相对于网格的边缘进行调整控件的大小。

  自动内容尺寸:Grid尺寸的变化将基于行或者列中的子元素的内容而定,在XAMl中,通常使用Auto来进行设定,代码如下:

  <RowDefinitions height="AUTO" />

  3按比例分配剩余空间:这些默认设置,通常使用*、1*、2*等样式来指定,按比例分配空间是指,当使用精确尺寸分配或自动内容尺寸分配后,所剩余的空间如何进行分配。

这是一个相对单位,默认是*(一个星号)。表示将获取所有剩余空间。当有两个列都设置为*时,其将按比例个一半进行空间分配。如果为一列指定2*,另一个列指定*,则将

剩余的空间分为3份,其中,2*的列将占用2/3的空间,而*的则占用1/3的空间,代码如下

    <Grid ShowGridLines="True" >
<Grid.ColumnDefinitions>
<!--~定义3列-->
<ColumnDefinition />
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<!--~定义3行-->
<RowDefinition Height="2*" />
<RowDefinition Height="*" />
<RowDefinition Height="3*"/>
</Grid.RowDefinitions> </Grid>

编程创建Grid控件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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.Navigation;
using System.Windows.Shapes; namespace WpfApplication8
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Content= CreadteGrid();
}
public Grid CreadteGrid()
{
Grid gr = new Grid(); //首先实例化一个Grid
RowDefinition row1 = new RowDefinition(); //创建第一行,行的height和列的Width都是GridLength类型的对象。该对象有三个重载
//构造函数,分别对应到Grid空间志存模式。这里使用GridUnitType.Star来指定尺寸单位,star在XAMl中就是一个*号;
row1.Height = new GridLength(,GridUnitType.Star);
gr.RowDefinitions.Add(row1); //行row1添加到Grid面板中
RowDefinition row2 = new RowDefinition(); //定义第二行
//这里使用GridLength的静态方法来指定自动内容适应
row2.Height = GridLength.Auto;
gr.RowDefinitions.Add(row2); //添加第二行
TextBox tb = new TextBox();
tb.Text = "这是一个对话窗口,RowDefinitons的height属性被设置为* 那么textbox将占用剩余空间";
tb.TextWrapping = TextWrapping.Wrap; //文本换行操作
Grid.SetRow(tb,); //使用Grid控件的附加属性设置textbox控件在Grid中的位置
Grid.SetColumn(tb,);
gr.Children.Add(tb); //添加元素到grid中 StackPanel stk = new StackPanel(); //创建stackpanel对象
//设置Stackpanel方向
stk.Orientation = Orientation.Horizontal;
//设置Stackpanel水平布局
stk.HorizontalAlignment = HorizontalAlignment.Right;
//设置Stackpanel在grid0列
Grid.SetColumn(stk,);
Grid.SetRow(stk,);
gr.Children.Add(stk);
Button btn = new Button();
btn.Margin = new Thickness(,,,);
btn.Content = "确定";
btn.Padding = new Thickness(); //设置button 内容距离
stk.Children.Add(btn); Button btn1 = new Button();
btn1.Content = "取消";
btn1.Margin = new Thickness(,,,);
btn1.Padding = new Thickness();
stk.Children.Add(btn1);
return gr; //返回新创建的Grid对象
}

下面分析一下这段代码的实现。

  1.首先实例化一个Grid对象,接下来实例化RowDefinitions对象,该对象的height属性与ColumnDefinitions类似,是一个GridLength结构类型,为了给行和列设置尺寸

需要调用GridLength的构造函数来实例化对象。

  GridLength结构的两种构造函数如下。

    GridLength(Double):使用指定的绝对值,朱世华GridLength结构的新实例。

    GridLength(Double,GridunitType):初始化GridLength结构的新实例并指定它包含何种类型的值。

      如:为了给行指定100像素固定的高度

      row1.height=new GridLength(100);也可以显示的指定其单位类型row1.height=new GridLength(100,GridUnitType.pixel)

           GridUnitType枚举用于描述GridLength的单位类型,具有如下几种可选值

      Auto:大小有内容对象的大小决定。

      Pixel:该值表示为像素。

      Star:该值表示为可用空间的比例。*号

  注意:GridUnitType.Star通常是搭配使用的,如果为一行指定了33*,那么最好具有另外一个使用67*的单位,这样将会为剩余空间中的第一行

分配33%的空间,而另一行分配67%的空间。

2.创建了RowDefinition对象并指定其单位后,需要将其添加到Grid控件的RowDefinitions集合中,可以调用Grid.RowDefinitions.add方法来完成。

3.接下来创建放置在GridView控件中的子元素,必须使用Grid.setRow和Grid.SetColumn来设置元素将要放置的行、列位置,Grid.SetRow和Grid.SetColumn是Grid的

两个静态方法,用来设置附加属性。

合并行和列

  除了可以将一个控件放在一个单元格之外,也可以使用Grid控件的两个附加属性RowSpan和ColumnSpan将一个控件跨越多个行,形成合并行列的效果,

    <Grid ShowGridLines="False">
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<!--~在第1列 等0行显示一个文本块,并且使其跨越4列-->
<TextBlock Grid.Column="" Grid.ColumnSpan="" Grid.Row="" TextWrapping="Wrap" >请输入名称、文件夹/wendang huozhe internet资源,windows将会打开该资源</TextBlock>
<!--~创建一个Image对象来显示图像放置在0行0列 跨越2行-->
<Image Source="C:\Users\Administrator\Desktop\ASCL码.jpg" Grid.Column="" Grid.Row="" Grid.RowSpan="" />
<!--~在第2行第1列 放置一个textbox控件用来显示一个文本框该文本框跨越5列-->
<TextBox Grid.Column="" Grid.Row="" Text="请在此输入信息......" Grid.ColumnSpan="" Name="tb" MouseEnter="tb_MouseEnter" MouseLeave="tb_MouseLeave" />
<!--~在第4行的不同的列中分别放置3个按钮-->
<Button Content="确定" Grid.Row="" Grid.Column="" />
<Button Content="取消" Grid.Row="" Grid.Column="" />
<Button Content="浏览.." Grid.Column="" Grid.Row="" />
</Grid>

  下面来分析下代码的实现

    1.首先定义一个5列4行的Grid控件,接下来在第2行第1列放置了一个TextBlock子元素。在TextBlock中,使用了一个附加属性Grid.ColumnSpan,将该属性指定为4表示将从指定

的列开始跨越后面的4列,textBlock位于第2列,因此跨度为从第2列开始一直到最后一列。

    2.定义一个Image对象来显示一副图片,该对象位于第1列第1行,并使用Grid.RowSpan指定其跨度为跨越2行,那么图片将显示在第一列,并从第1列开始跨越到第2列的第一行。

    3.定义一个文本框对象,并指定Grid.ColumnSpan属性值为5.该对象将从第2行第二列开始,跨越5列。

    4.在第4行的第3.4.5列分别放置一个按钮。

窗体分割

  

  在Grid中,通过使用GridSpliter控件,可以为布局添加一个窗体分割条,使布局可以由用户来调整其大小。GridSplitter必须放置在Grid控件中,该控件使用户可以调整

Grid中的行列的大小。在使用GridSplitter之前,有如下几点需要调整

  •   GridSplitter控件必须放置在一个Grid列中,可以与已经存在的内容刚在一起。为了防止覆盖已存的内容,需要调整其Margin属性。通常建议在一个特定的行列中放置GridSplitter

并且行列的高度和宽设置为Auto。

  Gridsplitter控件将总是调整整个列或行的尺寸,而不是特定的单元格,例如

 

 

Grid控件的更多相关文章

  1. 完全使用一组 DSL 来操作 Grid 控件

    最近尝试了一下将 XtraGrid 的初始化工作封装成内部 DSL,例如一个普通的基础数据的增删改查操作的代码会像下面这样: public partial class UserForm : XtraF ...

  2. FineUI Grid控件高度自适应

    引言 页面里使用f:Grid控件,添加分页功能,然后高度填充整个页面. 如何使用 使用FineUI 控件的每个页面都有一个f:PageManager控件,它包含属性:AutoSizePanelID,设 ...

  3. WPF平台Grid控件性能比较

    WPF官方发布第一个版本至今已经有10年了, 我们几乎在同时也开始了XAML开发.即使经过多年打造,我们依旧尝试提高:我们真的成功打造了高效灵活的控件吗?我没有在其他地方找到任何关于优秀的WPF表格性 ...

  4. FineUI Grid控件右键菜单的实现

    FineUI官方Demo上一直没有Grid右键菜单的实现,其实从4.1.x的版本开始,允许添加自定义的事件监听(Listeners),所以要实现这个功能已经相当容易了. ExtJs右键菜单有很多种,对 ...

  5. 实现控件WPF(4)----Grid控件实现六方格

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 利用Grid控件能很轻松帮助我们实现各种布局.上面就是一个通过Grid单元格 ...

  6. 扩展ToolBarManager、ListView和Grid控件以实现气球式的ToolTip

    原文:扩展ToolBarManager.ListView和Grid控件以实现气球式的ToolTip infragistics是全球领先的UI工具和用户体验的专家,Infragistics开发了一系列的 ...

  7. wpf研究之道-grid控件

    想要说些什么,却不知道从哪开始."形而上谓之道,形而下谓之器".与其坐而论道,不如脚踏实地,从最实用的地方开始. 我们先来看看wpf中的grid控件.grid控件是个网格的布局控件 ...

  8. fine ui grid控件添加行号

    grid控件的列中添加如下代码<f:RowNumberField EnablePagingNumber="true" TextAlign="Center" ...

  9. C# grid控件用数据库分页后台怎么写?

    C#grid控件使用数据库分页的写法如下: mySystem.GetDataa(gridName.PageIndex *gridName.PageSize + 1, (gridName.PageInd ...

随机推荐

  1. Python 错误和异常小结

    1.Python异常类 Python是面向对象语言,所以程序抛出的异常也是类.常见的Python异常有以下几个,大家只要大致扫一眼,有个映像,等到编程的时候,相信大家肯定会不只一次跟他们照面(除非你不 ...

  2. 201621123023《Java程序设计》第11周学习总结

    一.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 二.书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallRun ...

  3. 《快学Scala》第一章 基础

  4. bash脚本编程学习笔记(一)

    bash脚本语言,不同于C/C++是一种解释性语言.即在执行前不需要事先转变为可执行的二进制代码,而是每次执行时经解释器解释后执行.bash脚本语言是命令的堆砌,即按照实际需要,结合命令流程机制实现的 ...

  5. 终于搞定在VS2010中将CString转换为const char*

    最近碰到了CString 转 const char *的问题. 以前只要简单的一个强制转换就OK了,可现在是不行了,搜索了很多资料,终于搞定,主要是Unicode和ANSI的问题,只要做一个转换就可以 ...

  6. jQuery 获取元素当前位置offset()与position()

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  7. [Alpha]Scrum Meeting#9

    github 本次会议项目由PM召开,时间为4月11日晚上10点30分 时长10分钟 任务表格 人员 昨日工作 下一步工作 木鬼 撰写每日例会报告 撰写每日例会报告撰写并整理任务分配博客 SiMrua ...

  8. python科学计算与可视化

    一.Numpy 库 NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库. 引用: import ...

  9. python实现数据库增删改查

    column_dic = {"id": 0, "name": 1, "age": 2, "phone": 3, &quo ...

  10. CentOS 7 安装RocketMQ遇到的问题汇总

    1.运行broker时提示内存无法分配 解决办法:http://www.bubuko.com/infodetail-2088958.html