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#代 ...
随机推荐
- win10安装配置nodejs
下载node 官网下载node 接下来在命令提示符里(win+R)输入node -v和npm -v,如图所示,表示安装完成. 测试, 配置node 在nodejs文件目录下,新建文件夹node ...
- 高可用性的负载均衡方案之lvs+keepalived和haproxy+heartbeat区别
高可用性的负载均衡方案 目前使用比较多的就是标题中提到的这两者,其实lvs和haproxy都是实现的负载均衡的作用,keepalived和heartbeat都是提高高可用性的,避免单点故障.那么他们为 ...
- 通过编写一个简单的日志类库来加深了解C#的文件访问控制
在程序的开发调试过程及发布运行后的状态监控中,日志都有着极其重要的分量,通过在关键逻辑节点将关键数据记录到日志文件当中能帮助我们尽快找到程序问题所在.网上有不少专业成熟的日志组件可用,比如log4ne ...
- 苹果手机的SB系列(1)听不懂人话的sir
写在前面,因手买错了(至于怎么买错了不解释)手机才买了一个苹果,价格不扉,但实在让人很不爽.记下了SB的点点. Sir听不懂人话,我让他查非洲安哥拉的时间,却屡次返回美国安哥拉洲的时间,很自恋.
- 常被问到的十个 Java 面试题
在这篇文章中,我试图收录最有趣和最常见的问题.此外,我将为您提供正确的答案. 接下来,就让我们来看看这些问题. 1. 以满分十分来评估自己——你有多擅长 Java? 如果你并不完全确信你自己或是你对 ...
- Linux c使用gumbo库解析页面表单信息(一)
一.gumbo介绍 gumbo是一个由谷歌开发的,能够解析html页面的库.功能稳定可靠,使用起来十分方便. 二.gumbo安装 (1)从https://github.com/google/gumbo ...
- ubuntu上安装并使用mysql数据库
一.安装Mysql 最简单的方式就是apt-get安装 安装核心程序 sudo apt-get install mysql-client-core-5.6 安装客户端程序 sudo apt-get i ...
- php处理ajax请求,ajax+php实现跨域
第一种方法通过设置Access-Control-Allow-Origin来实现跨域 1.首先要了解什么是域? 什么是域,简单来说就是协议+域名或地址+端口,3者只要有任何一个不同就表示不在同一个域.跨 ...
- cvte春招测试面试记录
cvte春招测试面试记录,挂在了综合面试(hr面)...尽量回忆面试的问题(可能不完全). 技术面一面: 1.自我介绍 2.根据实习项目问,智能客服怎么测正确率之类的. 3.测试人脸解锁 4.测试微信 ...
- Shadow Properties之美(二)【Microsoft Entity Framework Core随笔】
接着上一篇Shadow Properties之美(一),我们来继续举一个有点啰嗦的栗子. 先看简单需求:某HR系统,需要记录员工资料.需要记录的资料有: 员工号(规则:分公司所在城市拼音首字母,加上三 ...