范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

CWPF后台代码动态添加控件

  在wpf开发中,虽然可以通过XMAL编写炫酷的界面,但是有时候需要动态定义控件即:前台界面控件数量或者类型需要解析的数据或者其它条件确认再生成,这时候我们就需要通过后台cs中编写代码实现这一功能。
  01
  —   功能演示   02
  —   功能说明   以上演示部分我们可以看到我前台的部分界面在窗体加载后并没有显示,而是选择文件解析后自动产生的,这种场景有时候也挺常用,特别是有大量同类型的数据显示到同类型的控件中时,我们就可以通过导入txt、Xml等文件的形式然后自动生成. 本地主要是举例演示实现这一功能,使用场景造得可能并不恰当,大家忍受下。   03
  —   源码实现   前台代码:   <UserControl x:Class="Caliburn.Micro.Hello.DynamicalView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Caliburn.Micro.Hello" xmlns:cal="http://www.caliburnproject.org" xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="1.5*" /> <RowDefinition Height="8.5*" /> Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> Grid.ColumnDefinitions> <StackPanel Orientation="Horizontal" VerticalAlignment="Center" Grid.Row="0" Grid.ColumnSpan="2"> <TextBox Width="500" Height="30" Margin="3" Text="{Binding FilePath}" FontSize="14" FontStyle="Normal" IsReadOnly="True" /> <Button Content="..." Margin="3" MinWidth="50" cal:Message.Attach="[Event Click] = [Action SelectFile()]" /> StackPanel> <GroupBox Grid.Column="0" Grid.Row="1" Margin="3"> <GroupBox.Header> <dxlc:LayoutItem Label="Student" Foreground ="Green" /> GroupBox.Header> <dxlc:LayoutControl> <Grid HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Row="0" cal:Message.Attach="[Event Loaded] = [Action StudentGridLoaded($source)]" /> dxlc:LayoutControl> GroupBox> <GroupBox Grid.Column="1" Grid.Row="1" Margin="3"> <GroupBox.Header> <dxlc:LayoutItem Label="Teacher" Foreground ="Blue" /> GroupBox.Header> <dxlc:LayoutControl> <Grid HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Row="0" cal:Message.Attach="[Event Loaded] = [Action TeacherGridLoaded($source)]" /> dxlc:LayoutControl> GroupBox> Grid>UserControl>      这里使用了Caliburn.Micro框架,所以需要引用名称空间   xmlns:cal="http://www.caliburnproject.org"   因为控件数量不确定,需要显示不全时行列可以拖动,实现这一功能只需要把控件包裹进:<dxlc:LayoutControl >就可以。   后台代码: using DevExpress.Xpf.Editors;using PropertyChanged;using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Threading;using System.Threading.Tasks;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Forms;using Binding = System.Windows.Data.Binding;using HorizontalAlignment = System.Windows.HorizontalAlignment;using Label = System.Windows.Controls.Label;   namespace Caliburn.Micro.Hello{ [AddINotifyPropertyChangedInterface] public class DynamicalViewModel : Screen, IViewModel { private readonly AutoResetEvent StudentGridLoad = new AutoResetEvent(false);    private readonly AutoResetEvent TeacherGridLoad = new AutoResetEvent(false); public string FilePath { get; set; } = @"D: est.txt"; public List PersonInfoList = new List(); public PersonInfo PersonInfo { get; set; } public DynamicalViewModel() { DisplayName = "DynamicalControls"; }    public void DispalyReuslt() { Task.Run(() => { ParseData(); Execute.OnUIThread(() => { AddGridControl(); }); });    }    private void ParseData() { var lines = File.ReadAllLines(FilePath); foreach (string line in lines) { var strs = line.Split(":"); if (strs.Count() > 1) { var infos = strs[1].Split(","); PersonInfoList.Add(new PersonInfoDTO() { InfoType = strs[0], PersonInfo = new PersonInfo() { Name = infos[0], Sex = infos[1], Age = Convert.ToInt32(infos[2]) } }); } } }       public void SelectFile() { string defaultInputFolder = @"D: est.txt"; OpenFileDialog fileDialog = new OpenFileDialog(); if (defaultInputFolder != ) { fileDialog.InitialDirectory = defaultInputFolder; }    fileDialog.Multiselect = false;//该值确定是否可以选择多个文件 fileDialog.Title = "请选择ReportFile文件"; fileDialog.Filter = "文本文件(*.txt)|*.txt"; if (fileDialog.ShowDialog() == DialogResult.OK) { FilePath = fileDialog.FileName; } DispalyReuslt(); }    private Grid StudentGrid { get; set; } private Grid TeacherGrid { get; set; } public void StudentGridLoaded(object sender) { StudentGrid = (Grid)sender; } public void TeacherGridLoaded(object sender) { TeacherGrid = (Grid)sender; }    int studentRowIndex = 0; int studentColumnIndex = 0; int teacherRowIndex = 0; int teacherColumnIndex = 0; private void AddGridControl() { int StudentConut = 0; int TeacherCount = 0;    foreach (var item in PersonInfoList) { if (item.InfoType == "老师") { TeacherCount++; } else { StudentConut++; } }    StudentGrid.Children.Clear(); StudentGrid.ColumnDefinitions.Clear(); StudentGrid.RowDefinitions.Clear();    TeacherGrid.Children.Clear(); TeacherGrid.ColumnDefinitions.Clear(); TeacherGrid.RowDefinitions.Clear();    var gridColumns = 4; var successGridRows = Math.Ceiling(StudentConut / 2.0); var failGridRows = Math.Ceiling(TeacherCount / 2.0);    //添加grid列 for (int i = 0; i < gridColumns; i++) { var successColumnDefinition = new ColumnDefinition(); StudentGrid.ColumnDefinitions.Add(successColumnDefinition); var failedColumnDefinition = new ColumnDefinition(); TeacherGrid.ColumnDefinitions.Add(failedColumnDefinition); }       //添加grid行 for (int i = 0; i < successGridRows; i++) { var successRowDefinition = new RowDefinition(); StudentGrid.RowDefinitions.Add(successRowDefinition); successRowDefinition.Height = new GridLength(30, GridUnitType.Pixel);//绝对尺寸 }    for (int i = 0; i <= failGridRows; i++) { var failedRowDefinition = new RowDefinition(); TeacherGrid.RowDefinitions.Add(failedRowDefinition); failedRowDefinition.Height = new GridLength(30, GridUnitType.Pixel);//绝对尺寸 }    int rowIndex = 0; int columnIndex = 0; UIElement uIElement = new UIElement();    foreach (var item in PersonInfoList) { if (item.InfoType == "学生") { if (studentColumnIndex / 4 == 1) { studentColumnIndex = 0; studentRowIndex++; } rowIndex = studentRowIndex; columnIndex = studentColumnIndex; } else { if (teacherColumnIndex / 4 == 1) { teacherColumnIndex = 0; teacherRowIndex++; } rowIndex = teacherRowIndex; columnIndex = teacherColumnIndex; }    if (columnIndex % 2 == 0) { Label label = new Label(); label.HorizontalAlignment = HorizontalAlignment.Right; label.VerticalAlignment = VerticalAlignment.Center; label.Width = 100; label.Content = item.PersonInfo.Name; label.SetValue(Grid.RowProperty, rowIndex); label.SetValue(Grid.ColumnProperty, columnIndex);    uIElement = label; if (item.InfoType == "学生") { StudentGrid.Children.Add(uIElement); studentColumnIndex++; columnIndex = studentColumnIndex; } else { TeacherGrid.Children.Add(uIElement); teacherColumnIndex++; columnIndex = teacherColumnIndex; } }    TextEdit textBox = new TextEdit(); textBox.HorizontalAlignment = HorizontalAlignment.Left; textBox.VerticalAlignment = VerticalAlignment.Center; textBox.Name = item.PersonInfo.Name; textBox.Width = 100; textBox.Height = 25; textBox.SetValue(Grid.RowProperty, rowIndex); textBox.SetValue(Grid.ColumnProperty, columnIndex);    var path = item.PersonInfo.GetType().GetProperty("Age"); Binding binding = new Binding() { Source = item.PersonInfo, Path = new PropertyPath(path), Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }; textBox.SetBinding(TextEdit.TextProperty, binding); uIElement = textBox;       if (item.InfoType == "学生") { StudentGrid.Children.Add(uIElement); studentColumnIndex++; columnIndex = studentColumnIndex; } else { TeacherGrid.Children.Add(uIElement); teacherColumnIndex++; columnIndex = teacherColumnIndex; } } }    }}      数据模型: public class PersonInfo { public string Name { get; set; } public int Age { get; set; } public string Sex { get; set; }    public override string ToString() { string report = $"[Name] = [{Name}],[Age] = [{Age}],[Sex] = [{Sex}]"; return report; }    } public class PersonInfoEven : PersonInfo {    }    public class PersonInfoDTO { public string InfoType { get; set; } public PersonInfo PersonInfo { get; set; } }   这里需要注意一些地方:   ①首先StudentGridLoaded和TeacherGridLoaded是在viewmodel初始化完成后才加载的,所以在构造函数执行完后还是;   ②加载控件和解析数据比较慢我放在了线程Task.Run运行,但是线程中更新界面又需要用委托实现,这里CM给我们封装了方法 Execute.OnUIThread(() => { });   ③:grid行列添加: var successColumnDefinition = new ColumnDefinition(); StudentGrid.ColumnDefinitions.Add(successColumnDefinition);       var successRowDefinition = new RowDefinition(); StudentGrid.RowDefinitions.Add(successRowDefinition);   ④通过代码生成TextEdit,bing数据并添加到grid中: TextEdit textBox = new TextEdit(); textBox.HorizontalAlignment = HorizontalAlignment.Left; textBox.VerticalAlignment = VerticalAlignment.Center; textBox.Name = item.PersonInfo.Name; textBox.Width = 100; textBox.Height = 25; textBox.SetValue(Grid.RowProperty, rowIndex); textBox.SetValue(Grid.ColumnProperty, columnIndex);    var path = item.PersonInfo.GetType().GetProperty("Age"); Binding binding = new Binding() { Source = item.PersonInfo, Path = new PropertyPath(path), Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }; textBox.SetBinding(TextEdit.TextProperty, binding); uIElement = textBox; TeacherGrid.Children.Add(uIElement);   ⑤遍历grid中的控件: foreach (UIElement uiElement in failedParsedGrid.Children) { if (uiElement is TextEdit) { TextEdit textBox = uiElement as TextEdit; switch (textBox.Name) { //todo } } }   ⑥通过反射遍历属性: foreach (PropertyInfo info in PersonInfo.GetType().GetProperties())    {    var itemValue = info.GetValue(PersonInfo);    // TO DO    }

链接多元领域打造健康环境,蛋仔派对携手玩家传递正能量在信息碎片化时代里,人们每天浮光掠影地接收网络中无数的信息,但却因为缺乏有效的甄别而滋生了不少乱象。近年来为整顿网络环境,相关部门不断推出措施,对网络乱象重拳出击,持续为大家营造良大明王朝5位皇帝的离奇事迹,这么多年一直疑云重重,难解!明朝,是中国历史上的一个大一统王朝,从明太祖朱元璋开始,到明思宗朱由检,明朝共诞生了十六位皇帝,这十六位皇帝性格各有差异,在位期间的政绩也大不相同,其中第五位皇帝朱瞻基,他的身上更宋徽宗被俘9年生下14个孩子,为了活着他做了哪些令人不齿的事?宋徽宗是北宋第八位皇帝,哲宗死后他承兄继位,却放浪形骸,重用奸佞,他才学卓著,却为政昏庸无能。靖康元年(公元1127年)十一月二十五日,金军攻破北宋都城东京汴梁,俘虏了宋徽宗和宋钦几大银河系正在合并!韦伯新拍到潘多拉星系团前所未见的细节美国宇航局(NASA)的超级太空望远镜詹姆斯韦伯(JWST)拍到令人难以置信的最新深空图像在一个被称为潘多拉星系团(PandorasCluster)的区域,几个已经很大的银河系正在科技助力食品安全我国真菌毒素生物脱毒研究取得新进展真菌毒素是食品行业的主要污染源之一,也是引发食品安全问题的重要诱因,其中棒曲霉素是污染果蔬及其加工制品的主要真菌毒素。我国科学家成功制备出一种高效稳定可重复使用安全性高的棒曲霉素脱张江高科加快布局ampampquot22Xampampquot产业矩阵,打造ampampquot热带雨林ampampquot式产业生态在近日举行的张江高科2023客户交流会上,记者获悉,以科技产业控股集团为目标,张江高科正加快布局集成电路人工智能航空航天智能汽车重点产业,同时积极拓展大健康量子科技等未来产业,打造下一个深圳或诞生?马云和刘强东相继投资,华为也在此落户好内容我来评在中国走上改革开放道路以后,有一些城市在短时间内就完成了逆袭,这其中要以深圳为典型。虽然深圳的发展历史并不长,1979年才诞生,但是他的成长之路却令其他各大城市羡慕,如登上热搜!女子情人节送无车男友充电桩!闹剧背后,京东才是大赢家?每经记者董天意每经编辑裴健如特斯拉未买,充电桩先来。日前,上海一男子在情人节当日收到了来自女友的特殊礼物特斯拉充电桩。但该男子在视频中称,我还没有买车,你等我买车之后再送不好吗?他中国6G家底3月22日公布,美媒与中国的6G对决来了Hi,我的新朋友,这里是老默科技观察,先点赞,再收藏,关注不迷路。老默在中午饭局上听通信行业的朋友说,下个月22号,中国将在江苏南京举办全球6G技术大会,全面发布中国6G技术研发的市占率狂飙至70,韩网约车巨头操纵算法被罚257亿韩元2月14日,韩国反垄断机构宣布对互联网企业KaKaoMobility罚款257亿韩元(约合人民币1。37亿元),因其操纵算法对加盟出租车实施优待。据了解,KaKaoMobility美日荷联合抵制,中国半导体到底该何去何从?近日,美日荷联合对华发出抵制,在半导体方面给我国施加非常沉重的压力,华为就是最鲜明的例子,芯片一直是各种产业的支柱元件,但我国在芯片研发方面处于短板状态。迫于西方压力,西方在芯片方
26年后再看张怡宁王楠这对双子星的姐妹情,才是世间罕有01hr1996年,王楠18岁,彼时她还不是如今享誉世界的奥运冠军,而是正在国家队训练的小姑娘。这一天,李隼教练告诉王楠一会儿会来一个小队员跟你同住,日后你多照顾下。李隼教练离开不蔬果虽营养,但并非越多越好,想要科学健康食用,需做好3点在蔬菜和水果当中都含有大量的膳食纤维叶酸,各类维生素,以及一系列的矿物元素。这些物质可以提升人体的消化代谢功能,并且可以促使身体排毒,还可以加速血液循环,有着预防一系列心脑血管疾病茄子这样做,饭店58一份,在家做不到8元,营养又解馋,太香了导语茄子最好吃的做法,饭店58一份,在家做不到8元,营养又解馋,太香了!人间烟火气,最抚凡人心,柴米油盐最是平凡,简简单单却能温暖疲惫的身体,一日三餐四季,承载着烟火气的美食是最能探寻中国最后的狩猎部落,密林深处的美食本文转自美食台农历八月,暑气尽,湿气在地表凝结成了明显的露珠。正值白露节气,今日一过,天就完全转凉了。内蒙古根河市,中国最冷的城市,清晨四点,薄雾笼罩着北大兴安岭,久久不散,兴安岭宫女们最喜欢的差事为何是给皇上冲龙沟?对宫女有什么好处?公元前221年,自秦始皇大统一建立秦朝开始,封建君主专制权经过近两千年的逐步发展,终于在清朝初年达到顶峰。封建君权的日益强大与中央集权的增强是密不可分相辅相成的。并且在清朝初年的统华为Mate50硬刚iPhone14,综合对比你更喜欢哪一款?时隔两天时间,华为Mate50系列与iPhone14系列相继发布,两大高手对决让吃瓜群众看的好不热闹。既然同样是高端旗舰,华为虽然没有5G却便宜了1000元,综合对比能打得过苹果吗云南个旧有山有水,夏季凉爽,配套齐全,几万一套的房你会买吗?大家好,我是小白自媒体人,请点击关注。云南是一个旅游度假的好去处,云南有个地方叫个旧,有山有人的一个小县城,是县级市。这里配套齐全,是不少候鸟老人养老的好去处。这个地方原来热闹繁荣螃蟹肥不肥,看一眼这里就知道,一挑一个准,养殖户的经验真管用螃蟹肥不肥,看一眼这里就知道,一挑一个准,养殖户的经验真管用9月10日,既是教师节,又是中秋节,是个好日子,大家肯定要回家和家人团聚吧,一起吃月饼赏月,还要好好吃顿团圆饭。中秋也叫不想让妊娠纹爬满肚子,掌握2个妙招,产后轻松拥有白肚皮作为一个怀孕期间胖了二十几斤的孕妈,现在产后肚子上一根妊娠纹没有!可以负责任地告诉你,怀孕初期到晚期不想让妊娠纹毁了肚子,掌握2个妙招,产后轻松拥有小白肚!1预防淡化之前首先我们要京东商家会,给2022年双11浇了一盆冷水作者叶蓁原创深眸财经(chutou0325)618的硝烟还未散去,双11的脚步却一步步近了。9月7日,京东为今年双11筹备了一场商家会,或许是配合防疫,也或许是为了触达更多的商家,铁锅分生铁和熟铁,炒菜到底有啥区别?弄懂再买不吃亏俗话说民以食为天,我们每一个人都离不开一日三餐,想要做饭好吃,当然离不开炒菜锅,随着科技的发展,炒菜锅的种类越来越多。现在市面上最常见的炒菜锅,还是以铁锅为主,当然还有不粘锅,陶瓷