【WPF】03 动态生成控件

在这里插入图片描述

在这里插入图片描述

说明

今天记录一篇关于动态生成控件的方法,也是反复查了一些资料,逐步完善成自己需要的方法,感觉还是比较好用的。通过这个需求,在网上也找了一些资料,发现了一个开源图形UI组件HandyControl,觉得比较好,虽然暂时还没怎么用上,但安装完成后,确实美化了原来wpf的一些控件形状。
gtiee地址:https://gitee.com/handyorg/HandyControl

Nuget管理包安装
在这里插入图片描述

编码实现

直接上代码说明了,文章就不详细描述什么原理什么过程的,将来需要直接问大模型就好了。

动态添加RowDefinitions和ColumnDefinitions

首先,在XAML中,定义一个空的Grid,然后在代码后台(C#)中动态地向这个Grid添加RowDefinitions和ColumnDefinitions,以及相应的子控件(如TextBox)。

XAML部分:

<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="20,10,0,0" Height="380" Width="750" HorizontalAlignment="Left" VerticalAlignment="Top"><Grid x:Name="myDynamicGrid" Margin="5,5,5,5"><!-- 初始时不添加任何行,通过代码动态添加 --></Grid>
</ScrollViewer>

C#部分:

生成控件的部分

/// <summary>
/// 动态生成控件
/// </summary>
private void GenerateControls(int iRowsIndex)
{for (int i = 0; i < iRowsIndex; i++){RowDefinition rowDef = new RowDefinition{Height = new GridLength(50, GridUnitType.Pixel)};myDynamicGrid.RowDefinitions.Add(rowDef);myDynamicGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(750, GridUnitType.Pixel) });// 添加TextBlockTextBlock textBlock = new TextBlock{Text = "我的TextBlock",VerticalAlignment = VerticalAlignment.Top,HorizontalAlignment = HorizontalAlignment.Left,Margin = new Thickness(0,5,0,0)};Grid.SetRow(textBlock , i);Grid.SetColumn(textBlock , 0);myDynamicGrid.Children.Add(textBlock );// 添加TextBox//这里因为安装了HandyControl,所以在选择相关控件的时候,需要做区分,控件对象前增加命名空间索引System.Windows.Controls.TextBox textBoxNum = new System.Windows.Controls.TextBox{Text = "我的TextBox",TextAlignment = TextAlignment.Center,VerticalAlignment = VerticalAlignment.Top,HorizontalAlignment = HorizontalAlignment.Left,Background = new SolidColorBrush(Colors.LightGray),Margin = new Thickness(520, 0, 0, 0)};Grid.SetRow(textBoxNum, i);Grid.SetColumn(textBoxNum, 0);myDynamicGrid.Children.Add(textBoxNum);// 生成32x32的小图string imagePath = "/test.png";Image image = new Image{Height = 30,Width = 30,Tag = i,VerticalAlignment= VerticalAlignment.Top,HorizontalAlignment= HorizontalAlignment.Left,Source = new BitmapImage(new Uri(imagePath, UriKind.Relative)),Margin = new Thickness(600, 0, 0, 0)};// 图片事件image.MouseUp += DynamicImage_MouseUp;Grid.SetRow(image, i);Grid.SetColumn(image, 0); myDynamicGrid.Children.Add(image);// 生成label控件Label label = new Label{Content = "我的Label",Width = 680, HorizontalAlignment = HorizontalAlignment.Left,VerticalAlignment = VerticalAlignment.Top,Margin= new Thickness(5, 0, 0, 0),Height = 30,TabIndex = i,HorizontalContentAlignment = HorizontalAlignment.Left,VerticalContentAlignment = VerticalAlignment.Center,FontSize = 14};Grid.SetRow(label, i);Grid.SetColumn(label, 0);myDynamicGrid.Children.Add(label);// 生成Button控件Button button = new Button{Content = "我的Button",Width = 30,Height = 30,Tag = i,TabIndex= i,VerticalAlignment = VerticalAlignment.Top,HorizontalAlignment = HorizontalAlignment.Right,Background = new SolidColorBrush(Colors.LightGray),BorderBrush = new SolidColorBrush(Colors.LightGray),Margin = new Thickness(0, 0, 70, 0)};buttons.Add(button);// 按钮事件button.Click += (sender, e) => ToggleListBoxes(button.TabIndex);Grid.SetRow(button, i);Grid.SetColumn(button, 0);myDynamicGrid.Children.Add(button);// 生成List控件ListBox listBox = new ListBox{Name = $"ListBox{i}",Visibility = Visibility.Visible,Width = 680,TabIndex = (int)i,VerticalAlignment = VerticalAlignment.Top,HorizontalAlignment = HorizontalAlignment.Left,BorderBrush = new SolidColorBrush(Colors.White),Margin = new Thickness(5, 30, 0, 0)};// ListBox 选择变更事件listBox.SelectionChanged += ListBox_SelectionChanged; // 可选:为ListBox生成选择变更事件处理器 listBoxes.Add(listBox);Grid.SetRow(listBox, i);Grid.SetColumn(listBox, 0);myDynamicGrid.Children.Add(listBox);iRows++;}if (iRows> 0){// 这里执行其他相关操作}
}

相关参考事件,来自于大模型的生成代码。

/// <summary>
/// 动态图片控件的鼠标抬起事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DynamicImage_MouseUp(object sender, MouseButtonEventArgs e)
{//throw new NotImplementedException();Image mouseUP = sender as Image;if (mouseUP != null){int imgIndex = (int)mouseUP.Tag;for (int i = imgIndex; i < iRows; i++){strBarcode[i] = strBarcode[i + 1];strProName[i] = strProName[i + 1];strBat[i] = strBat[i + 1];strNum[i] = strNum[i + 1];}// 删除生成控件DeleteControls(iRows);// 删除grid容器的所有行myDynamicGrid.RowDefinitions.RemoveRange(0, iDetailsRows);// 整体行数减一iRows--;// 临时将全局的行数复制给变量iRowsAdd int iRowsAdd = iDetailsRows;if (iReAddDetails == 0){// 其他操作}else{iRows = 0;}// 删除一条数据后再次生成控件GenerateControls(iRowsAdd);}
}/// <summary>
/// 删除动态控件
/// </summary>
private void DeleteControls(int rowsToDelete)
{for (int i = InDetails.Children.Count - 1; i >= 0; i--){UIElement child = InDetails.Children[i];for (int j = 0; j < rowsToDelete; j++){if (Grid.GetRow(child) == j){InDetails.Children.Remove(child);}}}
}
/// <summary>
/// 按钮状态显示事件
/// </summary>
/// <param name="selectedIndex"></param>
private void ToggleListBoxes(int selectedIndex)
{foreach (var button in buttons){button.Content = button == buttons[selectedIndex] ? "▼" : "▲";}
}/// <summary>
/// ListBox事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{ListBox listBox = sender as ListBox;if (listBox != null && listBox.SelectedItem != null){string listBoxName = listBox.Name;string selectedItem = listBox.SelectedItem.ToString();char[] delimiters = { ':' };string[] parts = selectedItem.Split(delimiters, StringSplitOptions.None);if (parts.Length > 1){strInputPostionRet = parts[1]; // 符号后面的内容  // 处理选中项  System.Windows.MessageBox.Show($"{strInputPostionRet}");}else{Console.WriteLine("No content after delimiter.");}}
}

以上就是 动态添加RowDefinitions和ColumnDefinitions的方式实现动态生成控件的方法,这种方式比较简单,也容易实现。 还有其他推荐方法,虽然没有尝试,但这里也写出来,留待以后参考。

使用ItemsControl和DataTemplate

ItemsControl是一个强大的控件,它可以用来显示一个集合中的项,并且每个项都可以通过DataTemplate来定义其呈现方式。你可以将ItemsControl的ItemsPanel设置为Grid,但通常我们会使用UniformGrid(如果行和列数量相同且自动分配)或保持默认的StackPanel/WrapPanel等,并通过DataTemplate来定义每个项的布局,间接实现类似Grid的效果。

然而,如果你确实需要一个标准的Grid布局,并且想要动态控制行和列,你可能需要结合使用ItemsControl和自定义的Panel或者通过代码动态添加Grid的RowDefinitions和ColumnDefinitions。

使用MVVM模式

在更复杂的应用程序中,你可能会想使用MVVM(Model-View-ViewModel)模式来管理你的UI逻辑。在这种情况下,你可以在ViewModel中定义一个集合,该集合表示你想要在Grid中显示的数据项。然后,在View(XAML)中,你可以使用ItemsControl绑定到这个集合,并通过DataTemplate定义每个项的布局。虽然这种方法不直接在XAML中定义Grid的行和列,但它提供了一种更加灵活和可维护的方式来管理动态内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1543885.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【C++ 11多线程加速计算实操教程】

【C 11多线程加速计算实操教程】 1. 了解线程的基本概念2. 创建线程2.1 启动线程的基本示例&#xff1a;2.2 运行结果 3. 线程加速计算3.1 演示如何使用多个线程计算数组的和&#xff1a;3.2 运行结果3.3 结果分析3.4 拓展学习 4. 互斥量&#xff08;Mutex&#xff09;4.1 演示…

【GUI设计】基于图像边缘提取的GUI系统(5),matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于图像边缘提取的GUI系统&#xff08;5&#xff09;&#xff0c;用matlab实现。 本…

HTML、CSS

初识web前端 web标准 Web标准也称为网页标准&#xff0c;由一系列的标准组成&#xff0c;大部分由W3C (World Wide Web Consortium&#xff0c;万维网联盟) 负责制定。三个组成部分: HTML: 负责网页的结构(页面元素和内容)。CSS: 负责网页的表现(页面元素的外观、位置等页面样…

荣耀手机AI搜索革新体验:一键总结归纳,让信息获取更高效

在信息爆炸的时代&#xff0c;我们每天都被海量的数据包围&#xff0c;如何快速、准确地获取所需信息成为了现代人的一大挑战。 近日&#xff0c;荣耀手机宣布其AI搜索功能正式上线&#xff0c;这一创新举措不仅为使用者带来了前所未有的便捷体验&#xff0c;更在智能手机领域…

博图软件项目创建

目录 一、新建项目 二、IP设置具体的版本号查看方法 ​三、电脑IP设置如下 一、新建项目 1、双击打开软件 2、创建新项目&#xff0c;路径可以自己选择&#xff0c;填写相关信息&#xff0c;点击创建 3、选择组态设备 4、选择对应的的设备型号&#xff0c;点击添加 5、密…

【刷题2—滑动窗口】最大连续1的个数lll、将x减到0的最小操作数

目录 一、最大连续1的个数lll二、将x减到0的最小操作数 一、最大连续1的个数lll 题目&#xff1a; 思路&#xff1a; 问题转换为&#xff1a;找到一个最长子数组&#xff0c;这个数组里面0的个数不能超过k个 定义一个变量count&#xff0c;来记录0的个数&#xff0c;进窗口、…

Minio上传url资源文件,文件内容不全的问题

遇到问题 使用minio-client时候上传文件为url链接时候&#xff0c;上传inputstream流出现了文件上传成功&#xff0c;但是文件内容缺失&#xff0c;无法正常打开&#xff01; 先看看基本的依赖和配置代码&#xff1a; pom.xml依赖 <!-- tika MIME检测机制 --><depen…

JVM(HotSpot):程序计数器(Program Counter Register)

文章目录 一、内存结构图二、案例解读三、工作流程四、特点 一、内存结构图 二、案例解读 我们使用javap对字节码进行反编译&#xff0c;来看下程序计数器怎么体现的。 IDEA写一个简单的Java代码 反编译命令 javap -verbose InitTest.class $ javap -verbose InitTest.clas…

【AIGC】ChatGPT RAG提取文档内容,高效制作PPT、论文

目录 一、理解 RAG 技术 二、利用 ChatGPT 的 RAG 技术提取文档内容 三、高效制作 PPT 四、高效撰写论文 五、最佳实践与建议 六、工具推荐 随着人工智能生成内容&#xff08;AIGC&#xff09;的快速发展&#xff0c;利用先进的技术工具如 ChatGPT 的 RAG&#xff08;Ret…

R包安装教程,如何安装rjags和infercnv

一.介绍 在数据分析过程中&#xff0c;R语言因其强大的统计分析能力和丰富的包生态系统&#xff0c;成为众多研究人员和数据科学家的首选工具。本文将详细介绍如何在R环境中安装两个重要的R包——rjags和infercnv。rjags用于与JAGS&#xff08;Just Another Gibbs Sampler&…

基于 Amazon Bedrock +lambda函数调用大模型构建你的智能网页助手

​ 文章目录 1. 前言2. 使用到的关键产品2.1 Amazon Bedrock2.2 Amazon lambda2.3 Amazon API Gateway 3. 注册亚马逊云科技账号4. 构建大模型API4.1 调用 Amazon Bedrock4.2 使用 Amazon lambda函数4.3 调Amazon API Gateway 5. 构建应用调用API6. 总结 1. 前言 传统的大模型…

LabVIEW界面输入值设为默认值

在LabVIEW中&#xff0c;将前面板上所有控件的当前输入值设为默认值&#xff0c;可以通过以下步骤实现&#xff1a; 使用控件属性节点&#xff1a;你可以创建一个属性节点来获取所有控件的引用。 右键点击控件&#xff0c;选择“创建” > “属性节点”。 设置属性节点为“D…

怎么用gitee做一个图片仓库,在md文档中用这个图片网络地址,然后显示图片

痛因&#xff1a;我为什么要这样做&#xff0c;呃&#xff0c;我一开始图片都是存本地地址的&#xff0c;放在和这个md文档同级的assets文件夹下面&#xff0c;这样子确实当时很方便&#xff0c;复制粘贴什么也不用管&#xff0c;但是想把这个文档分享给别的人的时候&#xff0…

【有啥问啥】多臂老虎机(Multi-Armed Bandit,MAB)算法详解

多臂老虎机&#xff08;Multi-Armed Bandit&#xff0c;MAB&#xff09;算法详解 1. 引言 多臂老虎机&#xff08;Multi-Armed Bandit&#xff0c;MAB&#xff09;问题源自概率论和决策论&#xff0c;是一个经典的决策优化问题。最早提出的形式是赌场中的老虎机问题&#xff…

在线秘密基地--性能测试

根据之前的测试报告中的测试用例使用jmeter进行性能测试&#xff08;在性能测试之前&#xff0c;应先进行功能测试&#xff09;。 测试报告----功能测试_功能测试报告-CSDN博客https://blog.csdn.net/m0_74876421/article/details/141307905一、使用jmeter进行功能测试 可查看…

HDFS分布式文件系统01-HDFS架构与SHELL操作

HDFS分布式文件系统 学习目标第一课时知识点1-文件系统的分类单机文件系统网络文件系统分布式文件系统 知识点2-HDFS架构知识点3-HDFS的特点知识点4-HDFS的文件读写流程知识点5-HDFS的健壮性 第二课时知识点1-HDFS的Shell介绍HDFS Shell的语法格式如下。HDFS Shell客户端命令中…

STM32 软件触发ADC采集

0.91寸OLED屏幕大小的音频频谱&#xff0c;炫酷&#xff01; STM32另一个很少人知道的的功能——时钟监测 晶振与软件的关系&#xff08;深度理解&#xff09; STM32单片机一种另类的IO初始化方法 ADC是一个十分重要的功能&#xff0c;几乎任何一款单片机都会包含这个功能&a…

信息安全工程师(13)网络攻击一般过程

前言 网络攻击的一般过程是一个复杂且系统化的行为&#xff0c;其目标往往在于未经授权地访问、破坏或窃取目标系统的信息。 一、侦查与信息收集阶段 开放源情报收集&#xff1a;攻击者首先会通过搜索引擎、社交媒体、论坛等公开渠道获取目标的基本信息&#xff0c;如姓名、地址…

Pytest-如何将allure报告发布至公司内网

原理简介 使用Python启动HTTP服务器&#xff0c;指定一个端口号port&#xff0c;内网用户可以使用ipport访问报告。 本文章继续进阶&#xff0c;简单使用nginx进行一个代理&#xff0c;使用域名可以直接访问报告。 前情概述 Pytest-allure如何在测试完成后自动生成完整报告&am…

Axure大屏可视化模板:跨领域数据分析平台原型案例

随着信息技术的飞速发展&#xff0c;数据可视化已成为各行各业提升管理效率、优化决策过程的重要手段。Axure作为一款强大的原型设计工具&#xff0c;其大屏可视化模板在农业、园区、城市、企业数据可视化、医疗等多个领域得到了广泛应用。本文将通过几个具体案例&#xff0c;展…