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#代 ...
随机推荐
- CDI Features(EL(SPEL),Decorator,Interceptor,Producer)
一.EL(SPEL) EL 1.概述:EL是JSP内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作.EL在得到某个数据时,会自动进行数据类型 ...
- 开发部署项目时出现:java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: PermGen space 错误: 原文地址:http://www.cnblogs.com/shihujiang/archive/2012/06 ...
- Nodejs搭建基于express的应用,使用脚手架工具--express-generator
1.安装nodejs 1> 去nodejs官网下载最新nodejs安装包,地址:http://nodejs.cn/download/,选择自己适合自己电脑系统的安装包,下载下来,然后一直next ...
- error connecting to master 'repl@192.168.1.107:3306' - retry-time: 60 retries: 86400
很多时候,就算thread 正在进行,也不代表没有错误,一定要看看具体表示错误的变量 mysql> show slave status\G *************************** ...
- presto 函数中使用子查询
我们已知 在sql中子查询可以配合 in 或者 exists 来使用,但是如何把子查询的结果传给函数呢? 场景: 我们有一个 省份表 数据如下: id province 1 广东 2 ...
- 有趣的js(鼠标特效)
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- sql排列组合
一个表中4条记录,如何查询所有可能组成的结果. 例如: 1 2 3 4 四条记录,最后组成(12),(13),(14),(23),(24),(34) 最后sql如下: SELECT a.name ...
- 关于html的基础标签
html: 超文本标记语言 h1 -- h6: 标题标签 一级标题,一个页面中只能存在一个h1 数字越大,标题的级别越小br:换行p:段落 自带换行,前后自带间隙a::::href属性---指定将要跳 ...
- python 捕获异常顺序
catch 异常的时候,有关的异常(若是抛出子类异常,则父类异常的except也算.反之不算)except的语句是按代码顺序执行, 也就是说,当一个异常发生时,从若干except中若遇见异常类基类,父 ...
- node.js学习三--------------------- http服务器模块的搭建
/** * http服务器的搭建,相当于php中的Apache或者java中的tomcat服务器 */ // 导包 const http=require("http"); //创建 ...