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

news2024/11/16 17:40:49

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.coloradmin.cn/o/1376680.html

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

相关文章

2023.12.10查找,线性探测法

二叉树的重构 集合实现对图的dfs,bfs复写 插入排序 霍夫曼树&#xff0c;霍夫曼编码 查找成功&#xff0c;查找失败的期望值计算 9.给定散列表大小为11&#xff0c;散列函数为H(Key)Key%11。按照线性探测冲突解决策略连续插入散列值相同的4个元素。问&#xff1a;此时该散…

机器学习_8、支持向量机

支持向量机解决鸢尾花数据集分类问题 # 导入鸢尾花数据集 from sklearn.datasets import load_iris import pandas as pd import numpy as npiris_data load_iris() Xiris_data.data yiris_data.target# 划分训练集与测试集 from sklearn.model_selection import train_test_…

CES 2024:芯片厂商集体奔向AI,汽车芯片成为新赛道

科技云报道原创。 一年一度的CES又来了&#xff01; 美国当地时间1月9日&#xff0c;2024年国际消费类电子产品展览会&#xff08;CES&#xff09;如期举行。 作为全球最盛大的科技盛会&#xff0c;全球多个行业的顶尖企业都会参加CES。今年&#xff0c;展商们已经不约而同将…

公众号突破2个限制技巧怎么操作?

一般可以申请多少个公众号&#xff1f;目前企业主体只能申请2个公众号&#xff0c;这也意味着想做矩阵公众号的难度提升了。有些公司靠着诸多不同分工的公众号形成一个个矩阵&#xff0c;获取不同领域的粉丝。比如&#xff0c;目前主体为xx旗下公众号&#xff0c;共有30个&…

《YOLO算法:基础+进阶+改进》报错解决 专栏答疑

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。《YOLO算法&#xff1a;基础进阶改进》专栏上线后&#xff0c;部分同学在学习过程中提出了一些问题&#xff0c;笔者相信这些问题其他同学也有可能遇到。为了让大家可以更好地学习本专栏内容&#xff0c;笔者特意推出了该篇…

Docker 的工作原理及安装步骤【云原生】

文章目录 1. Docker 的工作原理2. Docker 与虚拟机3. Docker 架构4. 安装 Docker5. 配置镜像加速 1. Docker 的工作原理 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署会碰到一些问题&#xff1a; ① 依赖关系复杂&#xff0c;容易出现兼容性问题&#xff1…

2023.12.14,搜索遍历,走迷宫,青蛙跳

搜索遍历 AD,一定要模拟队列&#xff0c;在B中&#xff0c;2&#xff0c;6,0&#xff0c;由于6先入队&#xff0c;所以在访问6时&#xff0c;会优先把6的所有结点先入队&#xff0c;也就是确定好了下层的遍历顺序 即两个原则&#xff0c;1由近及远&#xff0c;符合层数递增关系…

GEE查看SMAP的L3级土壤水分产品并导出为TIFF

SMAP的L3级产品&#xff0c;时间分辨率为每日&#xff0c;空间分辨率为9KM&#xff0c;到2023年12月2日停止提供。 查看逐日的土壤水分变化 // 设置感兴趣区域&#xff08;Region of Interest&#xff09; var roi ee.FeatureCollection(projects/a-flyllf0313/assets/dacha…

【图文教程】win10 安装超级好用的 shell 工具---Atuin

Atuin 使用 SQLite 数据库取代了你现有的 shell 历史&#xff0c;并为你的命令记录了额外的内容。此外&#xff0c;它还通过 Atuin 服务器&#xff0c;在机器之间提供可选的、完全加密的历史记录同步功能。 推荐文章&#xff1a;https://mp.weixin.qq.com/s/T7ln6PTOeWEdjtxnor…

POI:对Excel的基本读操作 整理2

1 简单读取操作 public class ExcelRead {String PATH "D:\\Idea-projects\\POI\\POI_projects";// 读取的一系列方法// ...... } 因为07版本和03版本操作流程大差不差&#xff0c;所以这边就以03版本为例 Testpublic void testRead03() throws IOException {//获取…

力士乐触摸屏维修触控屏VR2109.01-00-01-N2-NNN-A

Rexroth力士乐触控屏VCP20.1BUN.768PB-NN-PW数控系统屏幕维修及排查&#xff1a; 力士乐数控机床故障诊断的一般步骤都是相同的。当数控机床发生故障时&#xff0c;除非出现危险及数控机床或人身的紧急情况&#xff0c;一般不要关断电源&#xff0c;要尽可能地保持机床原来的状…

我的隐私计算学习——联邦学习(3)

本篇笔记主要是根据这位老师的知识分享整理而成【公众号&#xff1a;秃顶的码农】&#xff0c;我从他的资料里学到了很多&#xff0c;期间还私信询问了一些困惑&#xff0c;都得到了老师详细的答复&#xff0c;相当nice&#xff01; &#xff08;五&#xff09;纵向联邦学习 —…

AI分割迁移绘画-neural-style

&#x1f3e1; 个人主页&#xff1a;IT贫道-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;私聊博主加WX好友&#xff0c;获取更多资料哦~ &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. 二值化展示图像代码…

性能测试分析案例-定位内核线程CPU利用率太高

环境准备 预先安装 docker、perf、hping3、curl 等工具&#xff0c;如 apt install docker.io linux-tools-common hping3 操作和分析 Linux 在启动过程中&#xff0c;有三个特殊的进程&#xff0c;也就是 PID 号最小的三个进程。 0 号进程为 idle 进程&#xff0c;这也是系…

【Git】查看凭据管理器的账号信息,并删除账号,解决首次认证登录失败后无法重新登录的问题

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是是《代码管理工具》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的…

SQL语句详解一

概念 什么是 SQL&#xff1f;&#xff08;如果还未安装MySQL请参考此文章安装下&#xff09; Structured Query Language&#xff1a;结构化查询语言其实就是定义和操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方&#xff0c;称为"方言"。 SQ…

[Linux 进程(二)] Linux进程状态

文章目录 1、进程各状态的概念1.1 运行状态1.2 阻塞状态1.3 挂起状态 2、Linux进程状态2.1 运行状态 R2.2 睡眠状态 S2.3 深度睡眠 D2.4 停止状态 T2.5 僵尸状态 Z 与 死亡状态 X孤儿进程 Linux内核中&#xff0c;进程状态&#xff0c;就是PCB中的一个字段&#xff0c;是PCB中的…

答题小程序源码系统:自带流量主广告位+视频激励广告 带完整的代码安装包以及搭建教程

随着互联网的迅速发展&#xff0c;各种应用程序层出不穷&#xff0c;而答题类小程序由于其独特的互动性和吸引力&#xff0c;成为了当前最热门的应用之一。答题小程序源码系统是一款基于微信小程序开发的源代码系统&#xff0c;它具有丰富的功能和灵活的定制性&#xff0c;可以…

视频号下载保姆级攻略:五大神级下载方法揭秘!

今天我要和大家聊聊一个非常有趣的话题&#xff0c;那就是如何下载视频号的视频。据我所知虽然很多人都知道视频号&#xff0c;但却不知道如何玩好视频号&#xff0c;以及怎么下载视频&#xff0c;我知道有些朋友可能对这个话题还不太了解&#xff0c;但是我相信&#xff0c;只…

决策树(公式推导+举例应用)

文章目录 引言决策树学习基本思路划分选择信息熵信息增益增益率&#xff08;C4.5&#xff09;基尼指数&#xff08;CART&#xff09; 剪枝处理预剪枝&#xff08;逐步构建决策树&#xff09;后剪枝&#xff08;先构建决策树再剪枝&#xff09; 连续值与缺失值处理连续值处理缺失…