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#代 ...
随机推荐
- oracle中delete、truncate、drop的区别 (转载)
一.delete 1.delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表 ...
- ORM概念
ORM概念: 指对象结构和数据库架构间的映射,对象和数据库架构有一定的映射关系,让程序员可以不必编写sql
- spring为什么推荐使用构造器注入
一.前言 项目中遇到一个问题:项目启动完成前,在A类中注入B类,并调用B类的某个方法. 那么调用B类的这个方法写在哪里呢,我选择写到构造器里,但是构造器先于Spring注入执行,那么执行构造器时, ...
- laravel(lumen)配置读写分离后,强制读主(写)库数据库,解决主从延迟问题
在Model里面加上下面这句,强制读主(写)库数据库,解决主从延迟问题. public static function boot() { //清空从连接,会自动使用主连接 DB::connection ...
- JS案例五:设置全选、全不选以及反选
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- linux下socket connect 阻塞方式 阻塞时间控制
同事今天问我,如何在linux下的c代码里面控制connect的阻塞时间.应用的背景是:linux下的c程序有两个目标IP需要connect,如果用阻塞方式,当其中一个IP不能连接的情况下,程序将阻塞 ...
- 关于FGPA的复位
关于FGPA的复位 当初开始学FPGA的时候,总是疑惑:FPGA不是没有复位管教么,但总在always看到有复位信号.这个复位信号(我们暂且称为rst_n)从哪里来? 实际上是可以从两个方面获得的,这 ...
- net core 随笔
UseApplicationInsights 这个有用到azure 才有用, 平时没用的话可以去掉. 遥测. 上下文指的是 进程间占有的资源空间. 当一个进程时间片到了或者资缺的时候就会让出CPU ...
- MinHook测试分析02 (x64)
在X64模式中,存在的问题是JMP指令和整个地址空间相比仅仅覆盖了很窄的范围.因此引入一个中继函数(Relay Function)来实现对64位Detour函数地址的跳转. 在hook的分析之前,先谈 ...
- CentOS7.6配置do.cker和K.B.S
方法一: 节点及功能 主机名 IP Master.etcd.registry K8s-01 10.8.8.31 Node1 K8s-02 10.8.8.32 Node2 K8s-03 10.8.8. ...