C# WPF上位机开发(动态添加控件)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
写图形界面软件的时候,我们经常会遇到一种情况。那就是图形界面上面,显示的控件可能是不定的。有可能多,也有可能少,具体显示多少内容需要根据配置文件而来。这样对我们来说,其实是有点尴尬的。毕竟,大多数场景,软件打开来之后,什么地方配置哪些内容,都是已经确定好的。
不过没关系,c# wpf也考虑到了这一点,我们可以通过编写代码的方法进行灵活添加和设置。毕竟,在xaml文件留下来的只是一个空的grid界面而已。

1、xaml界面设计
xaml界面就比较简单,为了显示方便,我们设计了两行。第一行的高度为100,剩下来的空间全部留给第二行。为了放置控件,还特地给这个grid起了一个名字叫mainGrid。
<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp"mc:Ignorable="d"Title="MainWindow" Height="450" Width="600"><Grid ><Grid.RowDefinitions><RowDefinition Height="100" /><RowDefinition /></Grid.RowDefinitions><Grid Grid.Row="1" x:Name="mainGrid"><!-- Add your own layout here --></Grid></Grid>
</Window>
2、初始化按钮
目前这个case只是为了演示如何添加控件。添加的内容比较少,就是一个按钮。首先初始化按钮,设置按钮的属性,分别是content、width和height。同时还给这个按钮配置了一个回调函数。按钮设置好了,再创建一个stack panel,将按钮装在这个stack panel里面。最后,也是最重要的一步,就是把stack panel保存到mainGrid的space里面,这样就实现了整个界面的部分。
public MainWindow(){InitializeComponent();AddButtonDynamically();}private void AddButtonDynamically(){// 创建一个新的Button控件Button newButton = new Button();// 设置Button的属性newButton.Content = "Click me!";newButton.Width = 100;newButton.Height = 100;// 为Button添加Click事件处理程序newButton.Click += NewButton_Click;// 创建一个StackPanel并将Button添加到其中StackPanel stackPanel = new StackPanel();stackPanel.Children.Add(newButton);// 将StackPanel添加到窗口中的Grid中mainGrid.Children.Add(stackPanel);}
按钮回调函数如下所示,
// Click事件处理程序private void NewButton_Click(object sender, RoutedEventArgs e){MessageBox.Show("Button Clicked!");}
3、多线程中更新界面
除了动态添加空间之外,另外一部分要注意的,就是界面部分和多线程的更新。启动一个线程很简单,不过如果如果在新的线程里面更新界面,这个是需要注意下的。为了说明这个问题,我们更新下界面,
<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp"mc:Ignorable="d"Title="MainWindow" Height="450" Width="600"><Grid ><Grid.RowDefinitions><RowDefinition Height="100" /><RowDefinition /></Grid.RowDefinitions><Label x:Name="text" Grid.Row="0" Content="0" HorizontalAlignment="Center"></Label><Grid Grid.Row="1" x:Name="mainGrid"><!-- Add your own layout here --></Grid></Grid>
</Window>
这个界面和之前的区别就是多了一个Label,放在了row 0当中,命名为text。解析来为了说明多线程,首先我们添加多线程库,
using System.Threading;
添加完了之后,就可以创建线程,启动线程了。一般每个线程都有对应的线程入口函数,
public MainWindow(){InitializeComponent();AddButtonDynamically();Thread newThread = new Thread(new ThreadStart(ThreadMethod));newThread.Start();}private void ThreadMethod(){int cnt = 0;while(true){cnt += 1;Dispatcher.Invoke(() =>{// 在UI线程上执行操作(如果需要)text.Content = Convert.ToString(cnt);});Thread.Sleep(1000);}}
多线程的操作很正常,这里面需要注意的就是text更新的部分。也就是说,如果需要更新界面的内容,最好用Dispatcher.Invoke()的方法来实现。
相关文章:
C# WPF上位机开发(动态添加控件)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 写图形界面软件的时候,我们经常会遇到一种情况。那就是图形界面上面,显示的控件可能是不定的。有可能多,也有可…...
MySQL进阶|MySQL中的事务(一)
文章目录 数据库事务MySQL中的存储引擎InnoDB存储引擎架构什么是事务事务的状态总结 数据库事务 MySQL 事务主要用于处理操作量大,复杂度高的数据。比方我想要删除一个用户(销户)以及这个用户的个人信息、订单信息以及其他信息,这…...
设计模式策略模式讲解和代码示例
引言 策略是一种行为设计模式, 它将一组行为转换为对象, 并使其在原始上下文对象内部能够相互替换。 原始对象被称为上下文, 它包含指向策略对象的引用并将执行行为的任务分派给策略对象。 为了改变上下文完成其工作的方式, 其他对象可以使用另一个对象来替换当前链接的策…...
Qt容器QStackedWidget小部件堆栈
# QStackedWidget QStackedWidget是Qt框架中的一个控件,用于在同一区域显示多个子控件,只有一个子控件可见。以下是一些常用的QStackedWidget函数: addWidget(QWidget *widget):向QStackedWidget中添加一个子控件。 insertWidget(int index, QWidget *widget):在指定位置…...
设计模式 简单工厂 工厂方法模式 抽象工厂模式 Spring 工厂 BeanFactory 解析
工厂模式介绍 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。它是创建型模式。 简单工厂 简单工厂模式是指由一个工厂对象决定创建出哪一种产品类的实例, 但它不属于GOF 23种设计模式 简单工厂适用于工厂类负责创建的对象较少的场景,…...
【Hive_03】单行函数、聚合函数、窗口函数、自定义函数、炸裂函数
1、函数简介2、单行函数2.1 算术运算函数2.2 数值函数2.3 字符串函数(1)substring 截取字符串(2)replace 替换(3)regexp_replace 正则替换(4)regexp 正则匹配(5ÿ…...
RabbitMQ手动应答与持久化
1.SleepUtil线程睡眠工具类 package com.hong.utils;/*** Description: 线程睡眠工具类* Author: hong* Date: 2023-12-16 23:10* Version: 1.0**/ public class SleepUtil {public static void sleep(int second) {try {Thread.sleep(1000*second);} catch (InterruptedExcep…...
java使用枚举类型解决if-else大量堆积
调用代码 import com.example.javaone.kk.MyEnum;public class Gst {public static void main(String[] args) {MyEnum eMyEnum.getById(1);System.out.println(e.getGetSize());} }被调用代码 package com.example.javaone.kk; public enum MyEnum {ENUM1(1,2),ENUM2(2,3),E…...
【数据结构】八大排序之直接插入排序算法
🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.直接插入排序简介及思路 直接插入排序(Straight Insertion Sort)是一种简单直观的插入排序算法. 它的基本操作是: 将一个数据插入到已经排好的有序表中,从而得到一个新的,数…...
网络编程『socket套接字 ‖ 简易UDP网络程序』
🔭个人主页: 北 海 🛜所属专栏: Linux学习之旅、神奇的网络世界 💻操作环境: CentOS 7.6 阿里云远程服务器 文章目录 🌤️前言🌦️正文1.预备知识1.1.IP地址1.2.端口号1.3.端口号与进…...
FreeSWITCH rtp endpoint recvonly
查了下rtp.c的源码,远端端口为0就意味着recvonly,但其实不然,调用switch_rtp_new会马上返回失败 经过反复测试,增加下面几行代码之后终于变成了recvonly: tech_pvt->mode RTP_RECVONLY; rtp_flags[SWITCH_RTP_FLAG_AUTOADJ];…...
Hadoop和Spark的区别
Hadoop 表达能力有限。磁盘IO开销大,延迟度高。任务和任务之间的衔接涉及IO开销。前一个任务完成之前其他任务无法完成,难以胜任复杂、多阶段的计算任务。 Spark Spark模型是对Mapreduce模型的改进,可以说没有HDFS、Mapreduce就没有Spark。…...
英文论文降重修改技巧 papergpt
大家好,今天来聊聊英文论文降重修改技巧,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 英文论文降重修改技巧 作为网站编辑,我们经常需要处理大量…...
DevOps搭建(十)-安装Harbor镜像仓库详细步骤
1、下载Harbor 官方地址: https://goharbor.io/ 下载地址: https://github.com/goharbor/harbor/tags 选择文档版本进行下载,这里我们选择v2.7.2版本 2、上传到服务器并解压 上传压缩包到服务器后,解压到/usr/local目录下&a…...
DDA 算法
CAD 算法是计算机辅助设计的算法,几何算法是解决几何问题的算法 CAD 算法是指在计算机辅助设计软件中使用的算法,用于实现各种设计和绘图功能,CAD 广泛应用于建筑、机械、电子等领域,可以大大提高设计效率和精度 绘图算法是 CAD…...
天猫数据平台-淘宝天猫数据-天猫销售数据分析:11月天猫平台滑雪运动装备行业销量翻倍!
随着天气变冷、冬季来临,迎来了疫情后的首个滑雪季,加之自冬奥会结束以来,大众参与冰雪运动的热度持续攀升,因此,冰雪运动的需求正集中释放。 根据相关数据显示,11月以来,全国滑雪场门票预订量较…...
使用OpenCV和PIL库读取图片的区别
OpenCV 和 PIL(Pillow)是两个不同的图像处理库,它们使用不同的数据结构来表示图像。 OpenCV 格式图像: OpenCV 中的图像通常表示为 NumPy 数组。这些数组可以是多维的,例如对于彩色图像,它们是三维数组&am…...
Amazon CodeWhisperer:AI 编程助手
文章作者:prigioni 1. 什么是 Amazon CodeWhisperer? Amazon CodeWhisperer 能够理解以自然语言(英语)编写的注释,并能实时生成多条代码建议,以此提高开发人员生产力。该服务可以直接在集成开发环境&#…...
Linux 使用 Anaconda+Uwsgi 部署 Django项目和前端项目
一、安装Anaconda 使用Anaconda创建python环境的优点: virtualenv只能创建系统原有的python版本,而不能创建创建任意版本的环境 而Anaconda的虚拟环境中,你可以指定任意现存可使用的python环境(包括比原环境版本高的python版本&a…...
分析若依的文件上传处理逻辑
分析若依的文件上传处理逻辑 注:已经从若依框架完成拆分,此处单独分析一下人家精彩的封装,也来理解一下怎么做一个通用的上传接口!如有分析的,理解的不透彻的地方,大家多多包含,欢迎批评指正&am…...
AUTOSAR NM实战避坑:从CANoe仿真到实车调试,搞定ECU异常唤醒与睡眠失败
AUTOSAR NM实战避坑指南:从仿真到实车的异常唤醒与睡眠失败解决方案 当ECU在深夜本该沉睡时突然"睁眼",消耗的不仅是电量,更是工程师的睡眠时间。这种场景在AUTOSAR网络管理(NM)开发中屡见不鲜——某个节点异…...
InSpec插件生态系统:扩展框架功能的完整教程
InSpec插件生态系统:扩展框架功能的完整教程 【免费下载链接】inspec InSpec: Auditing and Testing Framework 项目地址: https://gitcode.com/gh_mirrors/in/inspec InSpec作为一款强大的合规性测试框架,其真正的威力在于其可扩展的插件生态系统…...
4个步骤掌握Faze4机械臂开发:从硬件组装到智能控制的完整实践指南
4个步骤掌握Faze4机械臂开发:从硬件组装到智能控制的完整实践指南 【免费下载链接】Faze4-Robotic-arm All files for 6 axis robot arm with cycloidal gearboxes . 项目地址: https://gitcode.com/gh_mirrors/fa/Faze4-Robotic-arm Faze4开源六轴机械臂项目…...
PyTorch张量操作实战:从基础运算到CNN应用
1. PyTorch张量基础:从概念到创建 第一次接触PyTorch张量时,我完全被各种术语搞晕了。什么标量、向量、矩阵,还有这个奇怪的"张量"词。后来才发现,其实张量就是多维数组的另一种说法,只不过在深度学习中我们…...
PyTorch 2.8镜像一键部署教程:支持Slurm集群调度的HPC环境快速接入
PyTorch 2.8镜像一键部署教程:支持Slurm集群调度的HPC环境快速接入 1. 镜像概述与核心优势 PyTorch 2.8深度学习镜像是一个经过深度优化的高性能计算环境,专为现代AI工作负载设计。这个预配置环境最大的特点是开箱即用,免去了繁琐的环境配置…...
Java八股文面试题,堪称2026最强!!!
1、什么是 java 序列化,如何实现 java 序列化 难度系数:⭐ 序列化是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在…...
保姆级教程:用Python脚本一键将Labelme标注数据喂给YOLOv5/v8训练
从Labelme到YOLO:全流程数据转换与训练实战指南 当你完成数百张图像的Labelme标注后,面对满屏的JSON文件,是否曾为如何高效转换为YOLO格式而头疼?本文将以工业级解决方案,带你打通从标注到训练的全链路。不同于简单的格…...
告别“差不多就行”:用Cascade R-CNN解决目标检测中那些“似对非对”的边界框
从边界框“模糊地带”到工业级精度:Cascade R-CNN实战全解析 当你在自动驾驶系统中看到车辆识别框与真实车身存在5个像素的偏移,或在工业质检场景中某个关键缺陷的检测框刚好漏掉了1毫米的裂纹区域,这些“看似正确实则不准”的预测结果&#…...
从make clean到build.prop:揭秘Android系统属性生成的完整链条
从make clean到build.prop:揭秘Android系统属性生成的完整链条 当你通过adb shell getprop ro.build.display.id查看设备版本号时,是否好奇过这个字符串背后的生成逻辑?在Android编译系统中,从Makefile执行到最终生成build.prop文…...
Graphormer开源模型部署教程:3.7GB小模型+RTX4090一键启动分子建模服务
Graphormer开源模型部署教程:3.7GB小模型RTX4090一键启动分子建模服务 1. 项目介绍 Graphormer是一种基于纯Transformer架构的图神经网络模型,专门为分子图(原子-键结构)的全局结构建模与属性预测而设计。这个3.7GB的小模型在OG…...
