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

WPF控件-ItemsControl

介绍

ItemsControl是用于展示一组项的控件。我们常见的列表(ListBox)、数据表格(DataGrid)等都是继承自ItemsControl。可用于自定义样式展示各种批量的数据集合。

在这里插入图片描述

常见使用示例:

<ItemsControl ItemsSource="{Binding Items}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><StackPanel /></ItemsPanelTemplate></ItemsControl.ItemsPanel><ItemsControl.ItemTemplate><DataTemplate DataType="{x:Type xxClass}"><TextBlock Width="268" Margin="8" Text="{Binding Name}"/></DataTemplate></ItemsControl.ItemTemplate></ItemsControl>

ItemsControl用法

设置布局控件

在ItemsControl.ItemsPanel中定义使用的布局控件,作为ItemsControl中的基础布局控件。

常用的布局控件:

  • StackPanel
  • WrapPanel
  • Canvas

示例:

使用Stackpanel作为布局容器,可以设置他排序的方向等等。

 <ItemsControl.ItemsPanel><ItemsPanelTemplate><StackPanel Orientation="Horizontal" /></ItemsPanelTemplate></ItemsControl.ItemsPanel>

设置ItemTemplate项模版

获取或设置用来显示每个项的 DataTemplate。

ItemsControl.ItemTemplate中设置每一项的模版,项模版为DataTemplate数据对象模版类型,可以在<DataTemplate>下面设置自定义控件组合进行显示。

可以在DataTemplate中设置DataType属性为绑定的类型

示例:

<ItemsControl.ItemTemplate><DataTemplate DataType="{x:Type xxClass}"><TextBlock Width="268" Margin="8" Text="{Binding Name}"/></DataTemplate></ItemsControl.ItemTemplate>

设置ItemContainerStyle样式

设置应用于为每个项生成的容器元素的 Style。使用ItemContainerStyle设置样式,修改数据项的元素的外观。

用途和示例

用于自定义项样式的数据集合,比如横向、竖向平铺的列表,根据位置生成的布局图。

自定义样式的列表

设置ItemsPanel布局控件为StackPanel,如果需要横向布局,则设置StackPanelOrientation="Horizontal".设置ItemTemplate里面为自己想展示的内容样式,并绑定对应的数据。

代码示例:

Xaml:

  <ItemsControl ItemsSource="{Binding DataItems}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><StackPanel /></ItemsPanelTemplate></ItemsControl.ItemsPanel><ItemsControl.ItemTemplate><DataTemplate DataType="{x:Type local:DataModel}"><Border BorderBrush="Blue" BorderThickness="1"><TextBlockWidth="268"Margin="8"Text="{Binding Name}" /></Border></DataTemplate></ItemsControl.ItemTemplate></ItemsControl>

数据模型类DataModel:

定义一个模型类,用于数据绑定

 public class DataModel{public int Id { get; set; }public string Name { get; set; }public string Desc { get; set; }}

ViewModel:

在ViewModel中创建添加测试数据

public class MainWindowViewModel : ObservableObject
{public ObservableCollection<DataModel> DataItems { get; set; }public MainWindowViewModel(){DataItems = new ObservableCollection<DataModel>();DataItems.Add(new DataModel { Id = 1, Name = "张三",Desc="Id:1,Name:张三" });DataItems.Add(new DataModel { Id = 2, Name = "李四", Desc = "Id:2,Name:李四" });DataItems.Add(new DataModel { Id = 3, Name = "王五", Desc = "Id:3,Name:王五" });}
}

实现的效果:

纵向:

在这里插入图片描述

横向:

在这里插入图片描述

自定义布局图

通过绑定坐标来实现自定义控件按照一定的布局进行摆放,可以用于开发一些组态软件,设备布局图等。

代码示例:

在此以Canvas控件作为布局控件示例,使用ItemContainerStyleCanvas.LeftCanvas.Top两个属性进行绑定

   <ItemsControl ItemsSource="{Binding DataItems}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><Canvas /></ItemsPanelTemplate></ItemsControl.ItemsPanel><ItemsControl.ItemContainerStyle><Style><Setter Property="Canvas.Left" Value="{Binding X}" /><Setter Property="Canvas.Top" Value="{Binding Y}" /></Style></ItemsControl.ItemContainerStyle><ItemsControl.ItemTemplate><DataTemplate DataType="{x:Type local:DataModel}"><Border BorderBrush="Blue" BorderThickness="1"><TextBlockWidth="268"Margin="8"Text="{Binding Name}"ToolTip="{Binding Desc}" /></Border></DataTemplate></ItemsControl.ItemTemplate></ItemsControl>

在数据模型中,增加X和Y两个坐标属性,用于位置绑定

在WPF界面中,坐标都以左上角为原点,Y轴向下为正向+,X轴向右为正向+

 public class DataModel{public int Id { get; set; }public string Name { get; set; }public string Desc { get; set; }public int X { get; set; }public int Y { get; set; }}

在ViewModel中增加x、y的测试数据

 public class MainWindowViewModel : ObservableObject{public ObservableCollection<DataModel> DataItems { get; set; }public MainWindowViewModel(){DataItems = new ObservableCollection<DataModel>();DataItems.Add(new DataModel{Id = 1,Name = "张三",Desc = "Id:1,Name:张三",X = 100,Y = 100,});DataItems.Add(new DataModel{Id = 2,Name = "李四",Desc = "Id:2,Name:李四",X = 200,Y = 200,});DataItems.Add(new DataModel{Id = 3,Name = "王五",Desc = "Id:3,Name:王五",X = 300,Y = 300,});}}

实现的效果:

在这里插入图片描述

只需要改变x,y的值,布局就可以改变

在这里插入图片描述

在这里插入图片描述

扩展

ListBoxListViewDataGrid作为ItemsControl的子类,ItemsControl的用法,完全适用于他们,并且还有他们自带的属性

ListBox

ListBoxListView他们继承于Selector,可以实现ItemsControl的功能之外,还自带了选择器功能的属性。

如下示例

        <ListBox ItemsSource="{Binding DataItems}"><ListBox.ItemsPanel><ItemsPanelTemplate><Canvas /></ItemsPanelTemplate></ListBox.ItemsPanel><ListBox.ItemContainerStyle><Style><Setter Property="Canvas.Left" Value="{Binding X}" /><Setter Property="Canvas.Top" Value="{Binding Y}" /></Style></ListBox.ItemContainerStyle><ListBox.ItemTemplate><DataTemplate DataType="{x:Type local:DataModel}"><Border BorderBrush="Blue" BorderThickness="1"><TextBlockWidth="268"Margin="8"Text="{Binding Name}"ToolTip="{Binding Desc}" /></Border></DataTemplate></ListBox.ItemTemplate></ListBox>

布局效果于ItemsControl一致,还可以对里面的项进行选择

在这里插入图片描述

其他

其他如ListView和DataGrid都自带其他属性,会显示一些其他东西如表头什么的,如果要使用,还需要更进一步设置样式。

ListView:

在这里插入图片描述

DataGrid:

还有多选选择器功能
在这里插入图片描述

相关文章:

  • Elasticsearch 安装和配置脚本文档
  • 【C语言】案例:输出n位水仙花数
  • Python学习路线 - Python高阶技巧 - PySpark案例实战
  • Java Jackson库使用教程
  • 1.0 Zookeeper 分布式配置服务教程
  • 性能实测:分布式存储 ZBS 与集中式存储 HDS 在 Oracle 数据库场景表现如何
  • 【数据分享】1929-2023年全球站点的逐月平均风速(Shp\Excel\免费获取)
  • powershell 接收一个端口udp数据复制转发到多个目的
  • 【Linux】线程池线程安全的单例模式和STL读者写者问题
  • l + r >> 1; 的含义
  • Python入门:常用模块—os模块及sys模块
  • 探索未来:集成存储器计算(IMC)与深度神经网络(DNN)的机遇与挑战
  • 服务器与电脑的区别?
  • Conda历史版本下载地址和python对应关系
  • 【C#】.net core 6.0 创建默认Web应用,以及默认结构讲解,适合初学者
  • ➹使用webpack配置多页面应用(MPA)
  • CAP理论的例子讲解
  • CSS实用技巧
  • Docker入门(二) - Dockerfile
  • Laravel5.4 Queues队列学习
  • python学习笔记 - ThreadLocal
  • Vue2 SSR 的优化之旅
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 测试如何在敏捷团队中工作?
  • - 概述 - 《设计模式(极简c++版)》
  • 关于Flux,Vuex,Redux的思考
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 如何选择开源的机器学习框架?
  • 译有关态射的一切
  • ​渐进式Web应用PWA的未来
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #HarmonyOS:基础语法
  • #pragam once 和 #ifndef 预编译头
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (南京观海微电子)——I3C协议介绍
  • (五)IO流之ByteArrayInput/OutputStream
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)setTimeout 和 setInterval 的区别
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .net core Swagger 过滤部分Api
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换