当前位置: 首页 > news >正文

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()的方法来实现。

相关文章:

  • 【NTN 卫星通信】Starlink,费用、服务、市场(二)
  • JavaSE第7篇:封装
  • 使用ffmpeg命令进行视频格式转换
  • 单片机的低功耗模式介绍
  • Spring-整合MyBatis
  • 程序人生15年人生感悟
  • 代码随想录算法训练营第37天|● 738.单调递增的数字 ● 968.监控二叉树 ● 总结
  • 计算机网络 第四章(网络层)【下】
  • Java 内存模型(JMM)探寻原理,深度讲解
  • Android hwcomposer服务启动流程
  • B01、JVM与Java体系结构-01
  • 深入学习《大学计算机》系列之第1章 1.2节——问题描述与抽象
  • SearchWP WordPress高级网站内容搜索插件(包含所有专业扩展)
  • 2023年全球运维大会(GOPS深圳站)-核心PPT资料下载
  • flutter学习-day13-功能型组件和状态共享
  • [译]CSS 居中(Center)方法大合集
  • Akka系列(七):Actor持久化之Akka persistence
  • ESLint简单操作
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Linux中的硬链接与软链接
  • mysql常用命令汇总
  • oschina
  • RxJS: 简单入门
  • ucore操作系统实验笔记 - 重新理解中断
  • windows下如何用phpstorm同步测试服务器
  • yii2权限控制rbac之rule详细讲解
  • 安装python包到指定虚拟环境
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 深度解析利用ES6进行Promise封装总结
  • 我的面试准备过程--容器(更新中)
  • 系统认识JavaScript正则表达式
  • 一道闭包题引发的思考
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​iOS安全加固方法及实现
  • # 数据结构
  • #if和#ifdef区别
  • #传输# #传输数据判断#
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • ()、[]、{}、(())、[[]]命令替换
  • (145)光线追踪距离场柔和阴影
  • (2)nginx 安装、启停
  • (70min)字节暑假实习二面(已挂)
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • .a文件和.so文件
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET 设计模式初探
  • .NET 中的轻量级线程安全
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET企业级应用架构设计系列之应用服务器
  • /boot 内存空间不够
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @SuppressWarnings注解
  • [ linux ] linux 命令英文全称及解释
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600