探索WPF控件内容模型的四大支柱

WPF 内容模型

WPF控件内容模型主要指派生于System.Windows.Controls.Control类的各种控件,有四个可包含任意内容的类。 下表列出了继承自 Control 的类。

  • ContentControl:用于包含一段任意类型的内容。但是只能包含一个子元素作为其“内容”。它可以包含任何类型的公共语言运行时对象(例如 string 串或 DateTime 对象)或 UIElement 对象(如 Rectangle 或 Panel)。
  • HeaderedContentControl:提供了一个带标题的单一内容控件的基实现。控件包含一个 Header 和一个 Content 属性。Header 属性用于设置控件的标题,而 Content 属性用于设置控件的内容。
  • ItemsControl:用于呈现集合数据的一种控件。它提供了将集合数据以自定义方式呈现的功能,常用于列表、网格等数据展示。
  • HeaderedItemsControl:用于呈现带标题的集合数据的强大工具,通过自定义布局和样式,可以灵活地展示具有标题的集合数据。
    内容模型控件

ContentControl 内容控件

  • 只能包含一个子元素作为其“内容”这使得它非常适合用于展示单个内容元素。它的内容属性为 Content。在WPF控件中有许多继承ContentControl类的控件使用它的内容模型,比如:Button、ButtonBase、CheckBox、ComboBoxItem、ContentControl、Frame、GridViewColumnHeader、GroupItem、Label、ListBoxItem、ListViewItem、NavigationWindow、RadioButton、RepeatButton、ScrollViewer、StatusBarItem、ToggleButton、ToolTip、UserControl、Window
  • 在 Content 中只能放置一个控件(但是可以放置一个容器,然后再在容器中放置多个控件)。严谨来写,Content 的内容应该放置于<控件名.Content></控件名.Content>内部,但也可以省略此标记。
  • 下面写个例子
// 以Button为例子
<Grid><Grid.ColumnDefinitions><ColumnDefinition></ColumnDefinition></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition Height="80"></RowDefinition><RowDefinition Height="80"></RowDefinition><RowDefinition></RowDefinition></Grid.RowDefinitions><!--按钮有Button.Content,里面放置内容--><Button Grid.Column="0" Grid.Row="0"><Button.Content><TextBlock FontSize="32">我是一个有Content按钮</TextBlock></Button.Content></Button><!--省略Button.Content--><Button Grid.Column="0" Grid.Row="1"><TextBlock FontSize="32">我是一个省略Content按钮</TextBlock></Button><!--放置一个人容器放置多个内容--><Button Grid.Column="0" Grid.Row="2"><!--<Button.Content>--><StackPanel><TextBlock FontSize="32">我是一个文本</TextBlock><Image Source="1.png" Height="80"></Image><Label FontSize="32">我是一个Label</Label></StackPanel><!--</Button.Content>--></Button>
</Grid>

ContentControl

HeaderedContentControl 标头内容控件

  • HeaderedContentControl 类继承 ContentControl 类,表示带有 Header 的 ContentCo
    ntrol,其除了具有 ContentControl 的 Content 属性外,还具有一个 Header 属性,Hea
    der 的类型也是 Object 对象,与 Content 属性的用法类似。
  • 控件继承HeaderedContentControl 的有:Expander、GroupBox、TabItem。
  • 下面写个例子
 <Grid><Grid.ColumnDefinitions><ColumnDefinition></ColumnDefinition></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition></RowDefinition><RowDefinition></RowDefinition></Grid.RowDefinitions><!--TabControl 的TabItem里设置标头--><TabControl Grid.Row="0" Grid.Column="0"><TabItem><TabItem.Header><StackPanel Orientation="Horizontal"><Ellipse Width="10" Height="10" Fill="Red"/><TextBlock>我是一个有标头的tab</TextBlock></StackPanel></TabItem.Header><!--TabItem.Content 可以省略--><!--<TabItem.Content>--><StackPanel><TextBlock>这里是tab 的内容</TextBlock><Button Content="这里放置了一个按钮"></Button></StackPanel><!--</TabItem.Content>--></TabItem></TabControl><!--GroupBox 设置标头--><GroupBox Grid.Row="1" Grid.Column="0"><GroupBox.Header><TextBlock>这里是GroupBox 的标头</TextBlock><!--多个控件,外面需要包裹一个容器--><!--<StackPanel Orientation="Horizontal"><Ellipse Width="10" Height="10" Fill="Red"/><TextBlock>这里是GroupBox 的标头</TextBlock></StackPanel>--></GroupBox.Header><!--GroupBox.Content 可以省略--><!--<GroupBox.Content>--><StackPanel><TextBlock>这里是GroupBox的内容</TextBlock></StackPanel><!--</TabItem.Content>--></GroupBox></Grid>

HeaderedContentControl

ItemsControl 集合模型

  • ItemsControl 类继承自 Control,可以包含多个项,例如字符串、对象或其他元素。 它的内容属性为 ItemsSource 和 Items。 ItemsSource 通常用于使用数据集合填充 ItemsControl。 如果不想使用集合填充 ItemsControl,可使用 Items 属性添加项。
  • 控件继承 ItemsControl 的有:Menu、MenuBase、ContextMenu、ComboBox、ItemsControl、ListBox、ListView、TabControl、TreeView、Selector、StatusBar
  • 下面写个例子ListBox 使用ItemsSource 和 Items 填充数据集
// ListBox 使用ItemsSource填充数据集
<Grid><!--使用ItemsSource填充--><ListBox x:Name="listBoxs"></ListBox>
</Grid>
// ItemsSource  绑定
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Markup;
using System.Windows.Media;namespace WpfControlApp
{/// <summary>/// ItemsControl.xaml 的交互逻辑/// </summary>public partial class ItemsControl : Window{public ItemsControl(){InitializeComponent();// 设置绑定的数据源Binding binding = new Binding();//绑定源binding.Source = TextBlockItems;//设置绑定listBoxs.SetBinding(ListBox.ItemsSourceProperty, binding);}/// <summary>/// Source对象集合/// </summary>private List<TextBlock> TextBlockItems{get{List<TextBlock> result = new List<TextBlock>();// 遍历系统的所有字体foreach (FontFamily family in Fonts.SystemFontFamilies){foreach (KeyValuePair<XmlLanguage, string> pair in family.FamilyNames){TextBlock t = new TextBlock();// 设置字体名称t.Text = pair.Value;// 设置字体样式t.FontFamily = family;t.FontSize = 12;result.Add(t);}}// 返回一个 TextBlock 的控件对象集合return result;}}}
}

ItemsControl  ItemsSource

//  ListBox 使用Items 填充数据集
<Grid><Grid.ColumnDefinitions><ColumnDefinition></ColumnDefinition></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition></RowDefinition><RowDefinition></RowDefinition><RowDefinition></RowDefinition></Grid.RowDefinitions><!--使用Items方式--><ListBox Grid.Row="0" Grid.Column="0"><ListBox.Items><ListBoxItem><TextBlock>我是ListBoxItem第1行</TextBlock></ListBoxItem><ListBoxItem><TextBlock>我是ListBoxItem第2行</TextBlock></ListBoxItem><ListBoxItem><TextBlock>我是ListBoxItem第3行</TextBlock></ListBoxItem><ListBoxItem><TextBlock>我是ListBoxItem第4行</TextBlock></ListBoxItem></ListBox.Items></ListBox><!--省略ListBox.Items--><ListBox  Grid.Row="1" Grid.Column="0"><ListBoxItem><TextBlock>我是省略ListBox.Items第1行</TextBlock></ListBoxItem><ListBoxItem><TextBlock>我是省略ListBox.Items第2行</TextBlock></ListBoxItem><ListBoxItem><TextBlock>我是省略ListBox.Items第3行</TextBlock></ListBoxItem><ListBoxItem><TextBlock>我是省略ListBox.Items第4行</TextBlock></ListBoxItem></ListBox><!--省略ListBoxItem--><ListBox  Grid.Row="2" Grid.Column="0"><ListBox.Items><TextBlock>我是省略ListBoxItem第1行</TextBlock><TextBlock>我是省略ListBoxItem第2行</TextBlock><TextBlock>我是省略ListBoxItem第3行</TextBlock><TextBlock>我是省略ListBoxItem第4行</TextBlock></ListBox.Items></ListBox></Grid>

ItemsControl  Items

HeaderedItemsControl 有标头集合模型

  • HeaderedItemsControl 类继承自 ItemsControl,可以包含多个项,例如字符串、对象或其他元素,也可以包含标题。 它继承 ItemsControl 内容属性 ItemsSource 和 Items,并定义可以是任意对象的 Header 属性。
  • 控件继承自HeaderedItemsControl 并使用其内容模型:MenuItem、ToolBar、TreeViewItem
  • HeaderedItemsControl 模型可以理解为:一个 HeaderedItemsControl 包含一个 Items 集合,每一个 Item 包一个 Header 属性和一个子 Items 集合
  • 下面写个例子TreeView 和 TreeViewItem
 <Grid><!-- TreeView 设置两个根节点, 默认展开所有的Item 设置 IsExpanded="True"--><!--每个TreeViewItem都有一个头和一个Items集合--><TreeView><TreeView.Items><TreeViewItem IsExpanded="True"><TreeViewItem.Header><TextBlock Text="树的根节点1" /></TreeViewItem.Header><TreeViewItem.Items><TextBlock Text="树的节点1- 1" /><TreeViewItem IsExpanded="True"><TreeViewItem.Header><TextBlock Text="树的节点1- 2" /></TreeViewItem.Header><TreeViewItem.Items><TextBlock Text="树的节点1- 2 - 1" /><TextBlock Text="树的节点1- 2 - 2" /><TextBlock Text="树的节点1- 2 - 3" /></TreeViewItem.Items></TreeViewItem></TreeViewItem.Items></TreeViewItem><TreeViewItem IsExpanded="True"><TreeViewItem.Header><TextBlock Text="树的节点2" /></TreeViewItem.Header><TreeViewItem.Items><TreeViewItem IsExpanded="True"><TreeViewItem.Header><TextBlock Text="树的节点2- 1" /></TreeViewItem.Header><TreeViewItem.Items><TextBlock Text="树的节点21 - 1" /><TextBlock Text="树的节点2 1 - 2" /><TextBlock Text="树的节点2 - 3" /></TreeViewItem.Items></TreeViewItem><TreeViewItem IsExpanded="True"><TreeViewItem.Header><TextBlock Text="树的节点2 - 2" /></TreeViewItem.Header><TreeViewItem.Items><TextBlock Text="树的节点2- 2 - 1" /><TextBlock Text="树的节点2- 2 - 2" /><TextBlock Text="树的节点2 - 2 - 3" /></TreeViewItem.Items></TreeViewItem></TreeViewItem.Items></TreeViewItem></TreeView.Items></TreeView></Grid>

HeaderedItemsControl

公众号“点滴分享技术猿


关注

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

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

相关文章

图像分割deeplab系列

DeepLab系列是谷歌团队提出的一系列语义分割算法。DeepLab v1于2014年推出&#xff0c;并在PASCAL VOC2012数据集上取得了分割任务第二名的成绩&#xff0c;随后2017到2018年又相继推出了DeepLab v2&#xff0c;DeepLab v3以及DeepLab v3。DeepLab v1的两个创新点是空洞卷积&am…

【Python】新鲜出炉的海洋捕食者算法Python版本

2020年发表的海洋捕食者算法《Marine Predators Algorithm: A nature-inspired metaheuristic》。 作者只在原论文中给出了MATLAB代码&#xff0c;网上也没有Python版本&#xff0c;我自己用Python重写了MATLAB代码。 """2020海洋捕食者算法 """…

spaceship

通过数字平台启动您的网站、想法和未来&#xff0c;该平台旨在提供和连接您所需的域、托管、电子邮件和 Web 工具&#xff0c;并让您完全掌控 如果需要购买可以开5347的卡&#xff0c;点击获取

小学信息科技Python课程第2课:坐标与画笔

一、turtle画布与坐标系 在同一平面互相垂直且有公共原点的两条数轴构成平面直角坐标系。在坐标系中&#xff0c;水平方向的轴都称为x轴&#xff0c;垂直方向的轴都称为y轴 它们相交于O点&#xff0c;在这一个点里&#xff0c;x轴的值为0&#xff0c;y轴的值也为0&#xff0c;所…

掌握 Vue 响应式系统,让数据驱动视图(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

什么是网络数据抓取?有什么好用的数据抓取工具?

一、什么是网络数据抓取 网络数据抓取&#xff08;Web Scraping&#xff09;是指采用技术手段从大量网页中提取结构化和非结构化信息&#xff0c;按照一定规则和筛选标准进行数据处理&#xff0c;并保存到结构化数据库中的过程。目前网络数据抓取采用的技术主要是对垂直搜索引…

DNS解析和它的三个实验

一、DNS介绍 DNS&#xff1a;domain name server 7层协议 名称解析协议 tcp /53 主从之间的同步 udp/53 名字解析 DNS作用&#xff1a;将域名转换成IP地址的协议 1.1DNS的两种实现方式 1.通过hosts文件&#xff08;优先级最高&#xff09; 分散的管理 linux /etc/hos…

QA面试题

1、质量保证(QA)是什么&#xff1f; QA代表质量保证。QA 是一组活动&#xff0c;旨在确保开发的软件满足 SRS 文档中提到的所有规范或要求。QA 遵循 PDCA 循环&#xff1a; 计划/Plan - 计划是质量保证的一个阶段&#xff0c;组织在此阶段确定构建高质量软件产品所需的过程。做…

日志审计系统Agent项目创建——读取日志文件(Linux版本)

紧接着上一篇的分享&#xff0c;继续做日志文件的读取&#xff0c;点击连接即可日志文件初始化https://blog.csdn.net/wjl990316fddwjl/article/details/135553238 1、将指针移动到文件末尾 //文件移动到结尾fseek(fp, 0, SEEK_END); 2、定义当前指针的位置 lastPosition ft…

搭建算法日志自检小系统

&#x1f952; 前言 目前演示的是一个工具&#xff0c;但如此&#xff0c;未来完成有潜力可以演变为一整套系统。 &#x1f451;现场人员自检失败表计点位教程V2.0 NOTE: 如果没有“logfiles-meter-tool“目录的请联系我们进行提供&#xff01; &#x1f447; 进入<dist>…

WEB 3D技术 three.js 阴影属性

上文 WEB 3D技术 three.js 光照与阴影 我们说了阴影 那么 我们继续将阴影的属性 目前 我们的代码 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";//创建相机 cons…

【Git】的工作流程简介

目录 Git的工作区域Git的基本流程 1.将工作区的代码添加到暂存区2.将暂存区的文件提交到本地仓库3.将暂存区的文件提交到远程仓库 Git的工作区域 Git的基本流程 图形化方式操作 命令行模式&#xff08;Linux系统常用&#xff09;操作 1.将工作区的代码添加到暂存区 查看文件状…

OpenCV-19图像的仿射变换

放射变换是图像旋转&#xff0c;缩放&#xff0c;平移的总称&#xff0c;具体的做法是通过一个矩阵和原图片坐标进行计算&#xff0c;得到新的坐标&#xff0c;完成变换&#xff0c;所以关键就是这个矩阵。 一、仿射变换之图像平移 使用API------warpAffine&#xff08;src &…

OpenAI推出GPT商店,以充分利用ChatGPT在消费者市场上的成功

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

高压消防泵:科技与安全性的完美结合

在现代社会&#xff0c;随着科技的不断发展&#xff0c;各种高科技设备层出不穷&#xff0c;为我们的生活带来了极大的便利。在森林火灾扑救领域&#xff0c;恒峰智慧科技研发的高压消防泵作为一种高效、节能、绿色、环保的优质设备&#xff0c;将科技与安全性完美地结合在一起…

Jmeter接口自动化03-JMeter的常用核心组件

p03 高清B站视频链接 由于JMeter涉及的组件数目很多&#xff0c;据不完全统计至少有110个&#xff0c;而其实只需要掌握20%的组件就可以完成80%甚至更多的日常工作了&#xff0c;所以接下来我们重点剖析使用最频繁的核心组件&#xff0c;如下图所示。只需要优先掌握这10个左右…

css——文字实现渐变色的两种方案

&#xff08;一&#xff09;通过设置color、background-image及background-clip实现文字颜色渐变 <template><span class"title">文字实现渐变色的两种方案</span> </template><style> .title {color: transparent;background-image:…

DartSDK下载

下载DartSDK(具有开发Dart命令行、服务器和非FlutterWeb应用程序所需的库和命令行工具(底层支持作用系统库)) 1.Homebrew环境 //brew --version 2.brew tap dart-lang/dart 3.brew install dart 修改host 下载成功 描述信息查看 AndroidStudio 引入配置 备注&#xff1a; …

OpenHarmony——基于HDF驱动框架构建的Display驱动模型

概述 功能简介 LCD&#xff08;Liquid Crystal Display&#xff09;驱动编程&#xff0c;通过对显示器上电、初始化显示器驱动IC&#xff08;Integrated Circuit&#xff09;内部寄存器等操作&#xff0c;使其可以正常工作。 基于HDF&#xff08;Hardware Driver Foundation…

使用Pygame库创建了一个窗口,并在窗口中加载了一个名为“ball.png“的图片,通过不断改变物体的位置,实现了一个简单的动画效果

import pygame import sys# 初始化Pygame pygame.init()# 创建窗口 screen pygame.display.set_mode((640, 480))# 加载图片 image pygame.image.load("ball.png")# 将物体初始位置设为屏幕左上角 x 0 y 0# 游戏循环 while True:# 处理事件for event in pygame.e…