ItemsControl的常见用法

news2024/11/26 22:53:02

ItemsControl基本概念

image-20230725104735206

image-20230725104751861

用法1:设置奇偶行不同

<ItemsControl AlternationCount="2" ItemsSource="{Binding Stars}">
    <ItemsControl.Template>
        <ControlTemplate TargetType="ItemsControl">
            <DockPanel>
                <TextBlock DockPanel.Dock="Top" Text="Header" />
                <ItemsPresenter />
            </DockPanel>
        </ControlTemplate>
    </ItemsControl.Template>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border x:Name="border">
                <TextBlock Margin="10" Text="{Binding}" />
            </Border>
            <DataTemplate.Triggers>
                <Trigger Property="ItemsControl.AlternationIndex" Value="1">
                    <Setter TargetName="border" Property="Background" Value="#ccc" />
                </Trigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
/// <summary>
/// 一些字符串,用来展示基础的 ItemsSource 绑定,奇偶行交替颜色,以及表头
/// </summary>
public ObservableCollection<string> Stars { get; } =
    new() { "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune" };

image-20230725114256686

用法2:展示几何

/// <summary>
/// 用来展示替换 ItemsPanel 为 Canvas,以及修改 ItemContainerStyle
/// </summary>
public ObservableCollection<Shape> Shapes { get; } =
    new()
    {
    new(0, new(50, 50), Brushes.Red),
    new(1, new Point(150, 70), Brushes.Green),
    new(1, new Point(300, 160), Brushes.Blue),
    new(0, new Point(240, 260), Brushes.Yellow),
    };
<ItemsControl ItemsSource="{Binding Shapes}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <!--  主要使用ItemContainerStyle来控制Canvas等附加属性,因为元素会直接放在ContentPresenter上  -->
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <Setter Property="Canvas.Left" Value="{Binding Pos.X}" />
            <Setter Property="Canvas.Top" Value="{Binding Pos.Y}" />
        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Rectangle
                Name="rect"
                Width="40"
                Height="40"
                Fill="{Binding Color}" />
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding Type}" Value="1">
                    <Setter TargetName="rect" Property="RadiusX" Value="20" />
                    <Setter TargetName="rect" Property="RadiusY" Value="20" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

image-20230725115329676

用法3:不同数据类型展示

定义数据

public abstract class Fruit
{
    public int Amount { get; set; }
    public string FruitType => this.GetType().Name;
}
public class Apple : Fruit { }
public class Banana : Fruit { }
/// <summary>
/// 用于展示在 Resources 中存放多个 DataType 不同的 DataTemplate 的效果
/// </summary>
public ObservableCollection<Fruit> Fruits { get; } =
    new()
    {
    new Apple { Amount = 3 },
    new Apple { Amount = 2 },
    new Banana { Amount = 6 },
    new Apple { Amount = 4 },
    new Banana { Amount = 1 },
    new Banana { Amount = 5 },
    };
<ItemsControl ItemsSource="{Binding Fruits}">
    
    <ItemsControl.Resources>
        <DataTemplate DataType="{x:Type local:Apple}">
            <Border Height="30" Background="Aquamarine">
                <StackPanel VerticalAlignment="Center" Orientation="Horizontal">
                    <TextBlock Width="80" Text="{Binding FruitType}" />
                </StackPanel>
            </Border>
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:Banana}">
            <Border Height="30" Background="LightPink">
                <StackPanel VerticalAlignment="Center" Orientation="Horizontal">
                    <TextBlock Width="80" Text="{Binding FruitType}" />
                </StackPanel>
            </Border>
        </DataTemplate>
    </ItemsControl.Resources>
</ItemsControl>

image-20230725115601086

用法4,相同类型不同属性使用不同模板

定义数据

public record Employee(string Name, Gender Gender, int Age);

public enum Gender
{
    Male,
    Female
};
/// <summary>
/// 用于展示 DataTemplateSelector 的使用
/// </summary>
public ObservableCollection<Employee> Employees { get; } =
    new()
    {
    new("John", Gender.Male, 27),
    new("Anna", Gender.Female, 31),
    new("Joyce", Gender.Female, 28),
    new("Tony", Gender.Male, 40),
    new("Brian", Gender.Male, 36)
    };

要根据Gender性别属性显示不同的背景色,要使用ItemTemplateSelector。

ItemTemplateSelector

定义ItemTemplateSelector

public class EmployeeTemplateSelector : DataTemplateSelector
{
    public DataTemplate MaleTemplate { get; set; }
    public DataTemplate FemaleTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var element = container as FrameworkElement;
        var employee = item as Employee;
        return employee!.Gender switch
        {
            Gender.Male => MaleTemplate,
            Gender.Female => FemaleTemplate,
            _ => throw new ArgumentException()
        };
    }
}

使用

<ItemsControl FontSize="18" ItemsSource="{Binding Employees}">
    <ItemsControl.ItemTemplateSelector>
        <local:EmployeeTemplateSelector>
            <local:EmployeeTemplateSelector.MaleTemplate>
                <DataTemplate>
                    <StackPanel Background="LightCyan" Orientation="Horizontal">
                        <TextBlock Width="80" Text="{Binding Name}" />
                        <TextBlock Width="80" Text="{Binding Gender}" />
                        <TextBlock Text="{Binding Age}" />
                    </StackPanel>
                </DataTemplate>
            </local:EmployeeTemplateSelector.MaleTemplate>
            <local:EmployeeTemplateSelector.FemaleTemplate>
                <DataTemplate>
                    <StackPanel Background="LightPink" Orientation="Horizontal">
                        <TextBlock Width="80" Text="{Binding Name}" />
                        <TextBlock Width="80" Text="{Binding Gender}" />
                    </StackPanel>
                </DataTemplate>
            </local:EmployeeTemplateSelector.FemaleTemplate>
        </local:EmployeeTemplateSelector>
    </ItemsControl.ItemTemplateSelector>
</ItemsControl>

image-20230725120141218

ItemsControl和ListBox的区别

和ListBox不同的是,ItemsControl默认不启用UI虚拟化,在呈现数据量较大的时候会导致严重的性能问题。因此如果数据量较大,最好为其开启虚拟化,具体需要做的是:

1:(必需)将其ItemsPanel设置为虚拟化容器,如VirtualizingStackPanel。

2:(必需)重写ControlTemplate,为其添加ScrollViewer并将其的CanContentScroll属性设置为True。注意,用ScrollViewer包裹ItemsControl是无效的。

3:(非必需,进一步优化)在ItemsControl上设置附加属性VirtualizingPanel.VirtualizationMode为Recycling,以此进一步减少内存分配和回收压力

image-20230725090537203

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

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

相关文章

探秘MySQL底层架构:设计与实现流 程一览

点赞还是要求一下的&#xff0c;万一屏幕前的大漂亮&#xff0c;还有大帅哥就点赞了呢&#xff01;&#xff01;&#xff01;&#xff01; Author: 源码时代 Raymon老师 说在前头 Mysql&#xff0c;作为一款优秀而广泛使用的数据库管理系统&#xff0c;对于众多Java工程师来…

【NLP】图解变压器(transformer)

一、说明 在这篇文章中&#xff0c;我们将看看 The Transformer——一个利用注意力来提高这些模型训练速度的模型。转换器在特定任务中优于谷歌神经机器翻译模型。然而&#xff0c;最大的好处来自变压器如何适应并行化。事实上&#xff0c;谷歌云建议使用The Transformer作为参…

C语言第八课-----函数定义和使用的延续

作者前言 个人主页::小小页面 gitee页面:秦大大 一个爱分享的小博主 欢迎小可爱们前来借鉴 __________________________________________________________ 目录 1.复习 库函数 自定义函数 函数参数 函数调用 函数的嵌套调用和链式访问 2. 函…

SQL-每日一题【601.体育馆的人流量】

题目 表&#xff1a;Stadium 编写一个 SQL 查询以找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录。 返回按 visit_date 升序排列 的结果表。 查询结果格式如下所示。 示例 1: 解题思路 前置知识 自然连接 自连接可以理解为自己连接自己&#xff0c;在一张表上…

【JAVASE】初识JAVA语言

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈Java &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 初识JAVA 1. Java语言概述1.1 Java是什么…

5月PMP成绩开始公布,你收到邮件了吗?

出&#xff01;成&#xff01;绩&#xff01;啦&#xff01; 分数公布啦&#xff01; 你&#xff01; 收到通过邮件了吗&#xff01; 等了好久终于等到今天&#xff01;心心念念的PMP考试成绩今天终于公布了&#xff01;凌晨五点开始就陆续听到了不少学员通过认证考试的消息…

模型构建——使用逻辑回归构建模型,lightGBM进行特征筛选

1、模型构建流程 1.1 实验设计 新的模型要跟原有方案对比&#xff0c;而且是通过实验证明&#xff0c;特别注意模型和策略不能同时调整。一般实验设计包含以下流程&#xff1a; 问题&#xff1a;业务稳定后&#xff0c;可以去掉人工审核吗&#xff1f; 答&#xff1a;不可以…

PHP百度小程序rtc-room组件token获取经历

【前言】 目前就职盘古网络集团&#xff0c;一名PHPer程序员。我们的主营业务是百度产品相关&#xff0c;所以最近有了一个百度小程序项目&#xff0c;涉及其音视频组件做直播。 开发文档 百度智能小程序文档 鉴权token 百度智能小程序文档 嗯&#xff0c;很好的功能。结果测…

Keil系列教程06_工程目标选项配置(二)

1写在前面 本文接着上一篇文章《Keil系列教程05_工程目标选项配置&#xff08;一&#xff09;》讲述的工程目标选项的后五项配置&#xff1a;C/C编译、 Asm汇编、 Linker链接、 Debug调试、 Utilities公共。 2 C/C编译 这里“C/C选项”和“Asm选项”类似&#xff0c;主要是与…

数学建模-因子分析模型

导入数据的路径不能有英文 这边的框框自己放的

iOS-持久化

目的 1.快速展示&#xff0c;提升体验 已经加载过的数据&#xff0c;用户下次查看时&#xff0c;不需要再次从网络&#xff08;磁盘&#xff09;加载&#xff0c;直接展示给用户 2.节省用户流量&#xff08;节省服务器资源&#xff09; 对于较大的资源数据进行缓存&#xf…

探索容器镜像安全管理之道

邓宇星&#xff0c;Rancher 中国软件架构师&#xff0c;7 年云原生领域经验&#xff0c;参与 Rancher 1.x 到 Rancher 2.x 版本迭代变化&#xff0c;目前负责 Rancher for openEuler(RFO)项目开发。 最近 Rancher v2.7.4 发布了&#xff0c;作为一个安全更新版本&#xff0c;也…

(二)安装部署InfluxDB

以下内容来自 尚硅谷&#xff0c;写这一系列的文章&#xff0c;主要是为了方便后续自己的查看&#xff0c;不用带着个PDF找来找去的&#xff0c;太麻烦&#xff01; 第 2 章 安装部署InfluxDB 1、linux 安装方式如下 通过包管理工具安装&#xff0c;比如apt 和yum直接下载可执…

PHP注册、登陆、6套主页-带Thinkphp目录解析-【强撸项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 上效果图主页注册&#xff0c;登陆 phpStudy 设置导数据库项目目录如图&#xff1a;代码部分&#xff1a;控制器前台的首页 其它配套页面展示直接给第二套方案的页面吧第三套…

不会编程也能做数据分析?奥威BI系统就这么任性

BI系统有强大的大数据计算分析能力&#xff0c;能在短时间内完成海量数据智能可视化分析&#xff0c;满足大数据时代企业精细化数据分析要求。早期BI系统要求使用者具备一定IT基础&#xff0c;导致业务无法自主分析&#xff0c;而随着零编程BI系统的出现&#xff0c;业务部门也…

vue中实现列表自由拖拽排序

元素的 dragable 属性设置 为 true &#xff08;文本 图片 链接 的draggable 属性默认为 true&#xff09;则元素可拖放 <template><transition-group class"list"><uldragstart"dragstart(index)"dragenter"dragenter($event, index)…

代码-【3 队列判断是否相同】

前提条件&#xff1a; int QueueEmpty(Queue Q); //判断队列空否&#xff0c;1为空&#xff0c;0为不空 int GetHead(Queue Q,ElemTypes &x); //通过x返回队头元素的值 void EnQueue(Queue &Q.ElemType x); //将新元…

网络—零拷贝

一、前言 磁盘可以说是计算机系统最慢的硬件之一&#xff0c;读写速度相差内存 10 倍以上。所以为了提高系统吞吐量&#xff0c;减少磁盘访问次数&#xff0c;有很多优化措施&#xff0c;比如直接IO、异步IO&#xff0c;但其实还有一种优化策略&#xff0c;那就是——零拷贝&am…

脉冲频率、转速计算(信捷PLC C语言FC编程应用)

转速、线速度、角速度转换和计算关系请查看下面文章链接: 转速/线速度/角速度计算FC_RXXW_Dor的博客-CSDN博客里工业控制张力控制无处不在,也衍生出很多张力控制专用控制器,磁粉制动器等,本篇博客主要讨论PLC的张力控制相关应用和算法,关于绕线机的绕线算法,大家可以参看…

Python学习笔记-Django框架基础,APP,数据模型,后台管理,路由

一、Django框架简介 Django框架是Python的常用web框架&#xff0c;遵循 MVC 设计模式的框架&#xff0c;采用了MTV的框架模式&#xff0c;即模型M&#xff0c;视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的&#xff0c;即是CMS&…