WPF-在Grid中编程添加控件
摘要:
在Grid中编程添加控件,布局控件的位置用到的代码是:
gridLayout.Children.Add(textblock);
Grid.SetRow(textblock, );
Grid.SetColumn(textblock, );
以上代码是把新创建的名称为textblock的TextBlock 控件添加到gridLayout的Grid控件中,放到第0行第1列。编程添加控件需要注意的就是一定要给新创建的控件一个符合命名规范的名称,这样在查找该控件修改其属性的时候会方便很多。在gridLayout中按名称查找TextBlock控件的方法:
foreach (object child in gridLayout.Children)
{
if (child is TextBox)
{
TextBox textBox = child as TextBox;
if (textBox.Name == name)
return textBox;
}
}
需要注意的是,gridLayout.Children 是所有直接添加到gridLayout中的控件, 并不是所有后代控件,例如,将StackPanel添加到gridLayout中, StackPanel中的所有控件包括TextBlock不能在gridLayout.Children中找到。
例子:
举个例子,生成一个4行5列的棋盘, 每个单元格中安放一个TextBlock控件和Button控件。单击Button控件将TextBlock的Name显示在TextBlock中。

XAML中定义gridLayout的Grid:
<Grid x:Name="gridLayout" >
</Grid>
生成Rows 和Columns:
public void LoadGridTable()
{
int[] Row = new int[] {, , , };
int[] Column = new int[] {,,,, }; gridLayout.ShowGridLines = true;
for(int i =; i< Row.Length; i++)
{
gridLayout.RowDefinitions.Add(new RowDefinition
{
Height = new GridLength()
});
} for(int j=; j< Column.Length; j++)
{
gridLayout.ColumnDefinitions.Add(new ColumnDefinition
{
Width = new GridLength()
});
}
}
在LoadGridTable()中,添加一个StackPanel到gridLayout中:
。。。
// Add TextBlock and Button
for(int i=; i< Column.Length; i++)
{
for(int j=; j<Row.Length; j++)
{
StackPanel stackPanel = new StackPanel();
// TODO: Add TextBlock and Button to the stackpanel
gridLayout.Children.Add(stackPanel);
Grid.SetRow(stackPanel, j);
Grid.SetColumn(stackPanel, i);
}
}
插入TextBox 和Button到StackPanel中,注意TextBox 和Button 的Name属性的命名规范:
StackPanel stackPanel = new StackPanel();
// TODO: Add TextBlock and Button to the stackpanel
stackPanel.Orientation = Orientation.Horizontal;
TextBox textBox = new TextBox();
textBox.Name = $"lbl_{j}_{i}";
textBox.Text = "NULL"; // Style
textBox.Width = ;
textBox.IsEnabled = false;
stackPanel.Children.Add(textBox); Button button = new Button();
button.Name = $"btn_{j}_{i}";
button.Content = "Tab";
button.Margin = new Thickness(, , , );
button.Click += Button_Click1;
button.Width = ;
stackPanel.Children.Add(button); gridLayout.Children.Add(stackPanel);
Button_Click1 以及按名称查找TextBox的处理方法:
private void Button_Click1(object sender, RoutedEventArgs e)
{
Button btn = sender as Button;
var name = btn.Name;
string[] identityIDs = name.Split(new char[] { '_' }); var textBoxName = $"lbl_{identityIDs[1]}_{identityIDs[2]}"; TextBox siblingTextBox = (TextBox)FindTextBoxByName(textBoxName);
siblingTextBox.Text = textBoxName.ToString();
} private object FindTextBoxByName(string name)
{
foreach (var child in gridLayout.Children)
{
if(child is StackPanel)
{
foreach (var spChild in ((StackPanel)child).Children)
{
if(spChild is TextBox)
{
if(((TextBox)spChild).Name == name)
{
return spChild;
}
}
}
}
}
return null;
}
当点击某个Button时, 在Button_Click1中,找到被点击Button的Name,解析出它所在的行和列,然后依据命名规范,拼接出相应TextBox的Name,按照Name去匹配gridLayout中的StackPanel下的所有TextBox,找到以后,改变TextBox的Text的值,从NULL修改成相应的Name的值。
WPF-在Grid中编程添加控件的更多相关文章
- WPF:理解ContentControl——动态添加控件和查找控件
WPF:理解ContentControl--动态添加控件和查找控件 我认为WPF的核心改变之一就是控件模型发生了重要的变化,大的方面说,现在窗口中的控件(大部分)都没有独立的Hwnd了.而且控件可以通 ...
- Android 在布局容器中动态添加控件
这里,通过一个小demo,就可以掌握在布局容器中动态添加控件,以动态添加Button控件为例,添加其他控件同样道理. 1.addView 添加控件到布局容器 2.removeView 在布局容器中删掉 ...
- VC中动态添加控件
VC中动态添加控件 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个 ...
- 结合ItemsControl在Canvas中动态添加控件的最MVVM的方式
今天很开心的收获: ItemsControl 中 ItemsPanel的重定义和 ItemContainerStyle 以及 ItemTemplate 三者的巧妙结合,在后台代码不实例化任何控件的前提 ...
- 怎样在不对控件类型进行硬编码的情况下在 C#vs 中动态添加控件
文章ID: 815780 最近更新: 2004-1-12 这篇文章中的信息适用于: Microsoft Visual C# .NET 2003 标准版 Microsoft Visual C# .NET ...
- android 在布局中动态添加控件
第一步 final LayoutInflater inflater = LayoutInflater.from(this); 第二步:获取需要被添加控件的布局 final LinearLayout l ...
- 可以装一把——c#中手动添加控件
TextBox txt = new TextBox(); //文本框控件 //如果想在移动控件位置 point(x,y) txt.Location = new Point(50,50); this.C ...
- MFC中动态添加控件----寻找多年的秘籍,吐血推荐
原文作者tianwaik 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立 ...
- 【WPF】C#代码动态添加控件的Margin属性
需求:一组按钮的数据是从服务器中Json数据发过来的,需要根据这个Json数据动态地添加这组按钮. 工具:使用http://www.newtonsoft.com/json来解析Json. 过程:C#代 ...
随机推荐
- 合并两个 Lambda 表达式
概述 在开发工作中,有些时候需要对一些增删改查进行封装(用 Lambda 表达式来筛选数据),但是又有一部分条件总是相同的,对于相同的部分可以直接写到方法里,而不同的部分作为参数传进去. 定义扩展方法 ...
- 获得ztree的所有子节点id
var treeNodeIds="";//获得所有树节点的id function aa(){ var treeObj = $.fn.zTree.getZTreeObj(" ...
- thymeleaf下拉框从后台动态获取集合数据并回显选中
今天遇到从后台集合中取出对象在前台页面下拉列表展示: <select name="signature" lay-search="" class=" ...
- 虚拟机centos7 基础模板制作
用于新模板制作,主要针对一些基本组件的安装 分区.安装不在此赘述 最小化安装centos7-minimal-1810 1.安装wget yum install wget -y 2.更换aliyun源 ...
- [CentOS] 环境变量设置的三种方法
在CentOS系统中添加环境变量的方法有几种,推荐第三种方法.这里以添加 TexLive 2017 的环境变量为例进行说明. 1. 修改 ~/.bash_profile 文档,在文末添加以下代码: ...
- lr12脚本参数化
1.注册.登录.获取商品列表lr脚本 Action() { lr_save_string("192.168.46.129:8080","IP"); ...
- 使用layer的弹窗时,出现layer引入成功,触发成功,控制台无报错,但是页面无变化或者仅出现遮罩层的问题的解决思路
------------------------------------------20180410补充------------------------------------------------ ...
- python中的turtle库(图形绘画库)
turtle绘图的基础知识:1. 画布(canvas) 画布就是turtle为我们展开用于绘图区域,我们可以设置它的大小和初始位置. 设置画布大小 turtle.screensize(canvwidt ...
- Python_Mix*函数名的使用以及第一类对象,闭包,迭代器,for循环的内部机制
一:函数名的应用(第一类对象) 函数名的命名规范和变量是一样的,函数名其实就是变量名, 0)函数名可以赋值给其他变量 def func(): #定义一个名为func的函数 print('my ange ...
- LoadRunner基本简介
# LoadRunner # ## 安装要求 ## 做性能测试的时候,电脑要是一个干净的系统. 尽量是裸装电脑纯净版,不能安装太多的浏览器,支持的有IE.Firefox.chrome ...