探索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,一经查实,立即删除!

相关文章

arm服务器和麒麟v10安装nacos

在arm飞腾服务器和麒麟V10SP3上安装nacos 服务器和系统版本 ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Lance)Kernel: 4.19.90-52.22.v2207.ky10.aarch64Build: Kylin Linux Advanced Server release V10 (S…

图像分割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 多线程 简介

python多线程简介 多线程的概念是相对单线程而言的。所谓单线程是指CPU在处理完成一项任务之前是不会开始处理第二件任务的。简单来说&#xff0c;单线程在执行任务时是有一定的顺序的。而随着科技的进步&#xff0c;CPU等计算机组件的升级换代日新月异&#xff0c;CPU处理速度…

小学信息科技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; 蓝桥云课签约作者、已在蓝桥云…

SpringBoot全局配置Long转String丢失精度的问题解决

第一种方式 简单粗暴&#xff0c;将所有的Long类型&#xff0c;改为String&#xff0c;数据库改成varchar类型&#xff1b; 第二种方式 自己建个配置类 extends WebMvcConfigurerAdapter 已经被弃用&#xff0c;直接实现WebMvcConfigurer该接口就行了 EnableWebMvc Config…

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

一、什么是网络数据抓取 网络数据抓取&#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…

深度生成模型(Deep Generative Models)

什么是机器学习 深度生成模型&#xff08;Deep Generative Models&#xff09;是一类利用深度学习方法生成新样本的模型。这些模型通常被用于生成与训练数据集相似的新数据&#xff0c;例如图像、文本或音频。深度生成模型的两个主要类型是生成对抗网络&#xff08;GANs&#…

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.将工作区的代码添加到暂存区 查看文件状…

蓝桥杯基础知识4 swap()、reverse()

蓝桥杯基础知识4 swap()、reverse() #include <bits/stdc.h> using namespace std;int main(){int a 10,b 20;cout << a << << b <<\n; //10 20swap(a,b);cout << a << << b <<\n; //20 10return 0; } C 在线工具 |…

CES 2024上的AI亮点

以下是CES 2024前两天AI方面亮点&#xff1a; 一个AI助手&#xff0c;取代你的智能手机应用程序的rabbit.tech人工智能驱动的捆绑式鞋子被称为“Moonwalkers”&#xff0c;可以让你走得更快 FitXR Slam的VR和健身创新WeHead的人工智能能给ChatGPT一张脸世界上第一个高清触觉游…

OpenCV-19图像的仿射变换

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

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

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