Grid控件
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控件的更多相关文章
- 完全使用一组 DSL 来操作 Grid 控件
最近尝试了一下将 XtraGrid 的初始化工作封装成内部 DSL,例如一个普通的基础数据的增删改查操作的代码会像下面这样: public partial class UserForm : XtraF ...
- FineUI Grid控件高度自适应
引言 页面里使用f:Grid控件,添加分页功能,然后高度填充整个页面. 如何使用 使用FineUI 控件的每个页面都有一个f:PageManager控件,它包含属性:AutoSizePanelID,设 ...
- WPF平台Grid控件性能比较
WPF官方发布第一个版本至今已经有10年了, 我们几乎在同时也开始了XAML开发.即使经过多年打造,我们依旧尝试提高:我们真的成功打造了高效灵活的控件吗?我没有在其他地方找到任何关于优秀的WPF表格性 ...
- FineUI Grid控件右键菜单的实现
FineUI官方Demo上一直没有Grid右键菜单的实现,其实从4.1.x的版本开始,允许添加自定义的事件监听(Listeners),所以要实现这个功能已经相当容易了. ExtJs右键菜单有很多种,对 ...
- 实现控件WPF(4)----Grid控件实现六方格
PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 利用Grid控件能很轻松帮助我们实现各种布局.上面就是一个通过Grid单元格 ...
- 扩展ToolBarManager、ListView和Grid控件以实现气球式的ToolTip
原文:扩展ToolBarManager.ListView和Grid控件以实现气球式的ToolTip infragistics是全球领先的UI工具和用户体验的专家,Infragistics开发了一系列的 ...
- wpf研究之道-grid控件
想要说些什么,却不知道从哪开始."形而上谓之道,形而下谓之器".与其坐而论道,不如脚踏实地,从最实用的地方开始. 我们先来看看wpf中的grid控件.grid控件是个网格的布局控件 ...
- fine ui grid控件添加行号
grid控件的列中添加如下代码<f:RowNumberField EnablePagingNumber="true" TextAlign="Center" ...
- C# grid控件用数据库分页后台怎么写?
C#grid控件使用数据库分页的写法如下: mySystem.GetDataa(gridName.PageIndex *gridName.PageSize + 1, (gridName.PageInd ...
随机推荐
- Android 屏幕适应
基础知识: 屏幕密度: Density-independent pixel (dp):密度无关像素单位(一个相对的值).1dp 的大小相当于一个 160 dpi 屏幕上一个像素的大小. 计算方法:px ...
- c语言博客作业06-文件
1.本章总结 1.1思维导图 1.2本章学习体会 这周学了结构体和文件,结构体作为一种数据的归类方式,相比数组或变量更具有整体全面性,例如一个数组只可以放一些按照元素顺序存放的单元变量,并且我们用 ...
- kubectl get componentstatus ERROR:HTTP probe failed with statuscode: 503
通过kubectl命令可以查看k8s各组件的状态: [root@wecloud-test-k8s-1 ~]# kubectl get cs NAME STATUS MESSAGE ERROR cont ...
- Python 错误和异常小结
1.Python异常类 Python是面向对象语言,所以程序抛出的异常也是类.常见的Python异常有以下几个,大家只要大致扫一眼,有个映像,等到编程的时候,相信大家肯定会不只一次跟他们照面(除非你不 ...
- django系列6--Ajax01 特点, 基本格式, 向前端发送数据
一.Ajax了解 AJAX(Asynchronous Javascript And XML)优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容 优点: 1.ajax使用Java ...
- ElasticSearch速学 - IK中文分词器远程字典设置
前面已经对”IK中文分词器“有了简单的了解: 但是可以发现不是对所有的词都能很好的区分,比如: 逼格这个词就没有分出来. 词库 实际上IK分词器也是根据一些词库来进行分词的,我们可以丰富这个词库. ...
- vue + ElementUI 表格筛选框的高度设置,超出一定高度,显示滚动条
相信有很多小伙伴遇到过这个问题,首先还是来看图片,筛选框我做了处理,所以和官网的有点小差别 官方网站和个人网站对比图如下: 代码如下:(F12找到该元素的class,设置高度) .el-table-f ...
- placeholder插件详解
placeholder插件是用来实现input或者textarea文本框显示默认文字的功能,当获得焦点时,默认文字消失.用户按删除键,把输入的字符删除掉,并失去焦点时,默认文字又出现等功能.使用此插件 ...
- iOS 时区获取问题
时区缩写 UTC, CST, GMT, CEST 以及转换 UTC是协调世界时(Universal Time Coordinated)英文缩写,是由国际无线电咨询委员会规定和推荐,并由国际时间局(BI ...
- C#-WinForm-TextBox中只能输入数字的几种常用方法(C#)
方法一: private void tBox_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 0x20) e.KeyCh ...