WPF 零基础入门笔记(2):控件模板+数据模版

news2024/11/25 12:51:21

文章目录

  • 文章合集地址
  • WPF控价模版
    • 解决重复嵌套标签书写的问题
    • 实战
  • WPF数据绑定
    • 解决界面和业务数据沟通的问题
  • WPF数据模版
    • 数据模板解决数据的样式设置(以CellTemplate为例)
    • 数据模板和控件模板的区别
    • ItemTemplate 元素模板
      • ItemTemplate是用于绝大部分控件的模板
    • ItemsPanel 元素布局模板
      • ItemPanel是用来解决重复布局的

文章合集地址

WPF基础知识博客专栏
WPF微软文档
WPF入门基础教程合集

WPF控价模版

WPF控件模板(6)

解决重复嵌套标签书写的问题

比如我写好了一个页面元素

 <Button Width="100">
     <TextBox Text="我是TextBox"></TextBox>
 </Button>

在这里插入图片描述
我有好多个按钮都是这个样式,我就要重复这个代码好多次

   <Button Width="100" Height="30">
            <TextBox Text="我是TextBox"></TextBox>
        </Button>
        <Button Width="100"
                Height="30">
            <TextBox Text="我是TextBox"></TextBox>
        </Button>
        <Button Width="100"
                Height="30">
            <TextBox Text="我是TextBox"></TextBox>
        </Button>
        <Button Width="100"
                Height="30">
            <TextBox Text="我是TextBox"></TextBox>
        </Button>
        <Button Width="100"
                Height="30">
            <TextBox Text="我是TextBox"></TextBox>
        </Button>

控件模板就是为了解决重复地声明嵌套控件元素的问题。

实战

我们新建一个Button按钮

            <Button Content="正常按钮"
                    Width="100"
                    Height="30" />

在这里插入图片描述
然后我们可以看到微软写的默认的按钮的副本

在这里插入图片描述
简单来说,按钮为什么长成这个样子,都是通过模板设置的

在这里插入图片描述
你看这个按钮,边框的黑的,文本居中放置,都是设置好的。

也不需要理解太多,我这里写一个控件模板的按钮

    <Window.Resources>
        <!--设置控件模版-->
        <ControlTemplate x:Key="defaultButtonTemplate"
                         TargetType="Button">
            <!--在这里相当于重新写了Button按钮,Button按钮的属性-->
            <Border Background="red"
                    CornerRadius="5">
                <StackPanel Orientation="Horizontal">
                    <TextBlock  Text=""
                                VerticalAlignment="Center" />
                    <!--这个是原本Button按钮的Content的属性,不添加就不显示Button了-->
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
                                      VerticalAlignment="{TemplateBinding VerticalAlignment}" />
                </StackPanel>
            </Border>
        </ControlTemplate>

    </Window.Resources>
    <Grid>
        <StackPanel>
            <Button Content="控件按钮"
                    Width="100"
                    Height="30"
                    Template="{StaticResource defaultButtonTemplate}"
                    VerticalAlignment="Center"
                    HorizontalAlignment="Center" />
            <Button  Content="正常按钮"
                    Width="100"
                    Height="30" />
        </StackPanel>
    </Grid>
</Window>

实现效果:
在这里插入图片描述
在这里插入图片描述

WPF数据绑定

解决界面和业务数据沟通的问题

我们需要前端拿到我们后端的数据,把他展示到前面来。当然这个前后端都是相对来说。其实是界面拿到我们业务层的数据

CS代码

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<Student> students = new List<Student>();
            students.Add(new Student() { UserName = "小王", ClassName = "高二三班", Address = "广州市" });
            students.Add(new Student() { UserName = "小李", ClassName = "高三六班", Address = "清远市" });
            students.Add(new Student() { UserName = "小张", ClassName = "高一一班", Address = "深圳市" });
            students.Add(new Student() { UserName = "小黑", ClassName = "高一三班", Address = "赣州市" });
            //gd是前端的控件名称。设置gd的数据源
            gd.ItemsSource = students;

        }


    }
    ///声明Student实体类
    public class Student
    {
        public string UserName { get; set;}
        public string ClassName { get; set;}
        public string Address { get; set;}
    }

xmal代码

<!--这里声明gd,gd用来传给后端-->
 <DataGrid Name="gd"
                  AutoGenerateColumns="False"
                  CanUserSortColumns="True"
                  CanUserAddRows="False">
            <DataGrid.Columns>
                <!--绑定元素的UserName值,这里是弱绑定,不是强关联-->
                <DataGridTextColumn Binding="{Binding UserName}"
                                    Width="100"
                                    Header="学生姓名" />
                <DataGridTextColumn Binding="{Binding ClassName}"
                                    Width="100"
                                    Header="班级名称" />
                <DataGridTextColumn Binding="{Binding Address}"
                                    Width="200"
                                    Header="地址" />
      
            </DataGrid.Columns>
        </DataGrid>

实现效果

在这里插入图片描述

WPF数据模版

WPF数据模板(7)
数据模板一般分为一下几类:

  • ItemControl
    • CellTemplate:列模板
    • ItemTemplate:元素模板
    • ContentTemplate:内容模板

数据模板解决数据的样式设置(以CellTemplate为例)

在上文数据绑定的代码中新增

 <DataGrid Name="gd"
                  AutoGenerateColumns="False"
                  CanUserSortColumns="True"
                  CanUserAddRows="False">
            <DataGrid.Columns>
                <!--绑定元素的UserName值,这里是弱绑定,不是强关联-->
        
                <DataGridTextColumn Binding="{Binding UserName}"
                                    Width="100"
                                    Header="学生姓名" />
                <DataGridTextColumn Binding="{Binding ClassName}"
                                    Width="100"
                                    Header="班级名称" />
                <DataGridTextColumn Binding="{Binding Address}"
                                    Width="200"
                                    Header="地址" />
                
        <!--使用Template进行扩展-->
        
                <DataGridTemplateColumn Header="操作"
                                        Width="100">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal"
                                        VerticalAlignment="Center"
                                        HorizontalAlignment="Left">
                                <Button Content="编辑" />
                                <Button Margin="8 0 0 0"
                                        Content="删除" />
                            </StackPanel>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

在这里插入图片描述

数据模板和控件模板的区别

数据模板控件模板
外标签CellTemplateControlTemplate
使用地方动态数据页面样式静态页面样式

Tips:这里说的动态是随数据生成的页面元素

ItemTemplate 元素模板

ItemTemplate是用于绝大部分控件的模板

 <Window.Resources>
        <!--设置控件样式,绑定的就是之前说的数据绑定。注意,只是声明了类,但是没有声明数据源-->
        <DataTemplate x:Key="comTemplate">
            <StackPanel Orientation="Horizontal"
                        Margin="5,0">
                <Border Width="10"
                        Height="10"
                        Background="{Binding Code}" />
                <TextBlock Text="{Binding Code}"
                           Margin="5,0" />
            </StackPanel>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <StackPanel Orientation="Horizontal"
                    HorizontalAlignment="Center">
            <!--取名cob,用于后台绑定数据源-->
            <ComboBox Name="cob"
                      Width="120"
                      Height="30">
                <!--使用ItemTemplate绑定-->
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal"
                                    Margin="5,0">
                            <Border Width="10"
                                    Height="10"
                                    Background="{Binding Code}" />
                            <TextBlock Text="{Binding Code}"
                                       Margin="5,0" />
                        </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
            <!--当然也可以写成样式的形式-->
            <ListBox Name="lib"
                     Width="120"
                     Height="100"
                     Margin="5,0"
                     ItemTemplate="{StaticResource comTemplate}" />
        </StackPanel>
    </Grid>

  public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<Color> ColorList = new List<Color>();
            ColorList.Add(new Color() { Code = "#FF8C00" });
            ColorList.Add(new Color() { Code = "#FF7F50" });
            ColorList.Add(new Color() { Code = "#FF6EB4" });
            ColorList.Add(new Color() { Code = "#FF4500" });
            ColorList.Add(new Color() { Code = "#FF3030" });
            ColorList.Add(new Color() { Code = "#CD5B45" });

            cob.ItemsSource = ColorList;
            lib.ItemsSource = ColorList;


        }


    }
    public class Color
    {
        public string Code { get; set; }
    }

实现效果

在这里插入图片描述

ItemsPanel 元素布局模板

ItemPanel是用来解决重复布局的

xmal

  <Grid>
        <ItemsControl Name="ic">
            <!--声明布局-->

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

            <!--声明配套的元素-->
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Button Width="50"
                            Height="50"
                            Content="{Binding Code}" />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>

cs代码

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<Test> tests = new List<Test>();
            tests.Add(new Test() { Code = "1" });
            tests.Add(new Test() { Code = "2" });
            tests.Add(new Test() { Code = "3" });
            tests.Add(new Test() { Code = "4" });
            tests.Add(new Test() { Code = "6" });
            ic.ItemsSource = tests;
        }


    }
    public class Test
    {
        public string Code { get; set; }
    }

实现效果

在这里插入图片描述

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

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

相关文章

CAT1模块 EC800M HTTP使用总结记录

分享记录一下 CAT1 模块EC800 HTTP 协议使用流程 ...... by 矜辰所致目录 前言一、基础说明1.1 CAT1 与 4G1.2 EC800M 模块1.3 HTTP 二、开始使用2.1 硬件设计部分2.2 模块上电流程2.3 PDP 上下文2.3.1 什么是 SGSN 和 GGSN &#xff1f; 三、 HTTP 流程3.1 客户端3.1.1 PDP 上…

UFS 13 - Logical Unit Management

UFS 13 - Logical Unit Management 1 Introduction2 Logical Unit features3 Logical Unit Configuration 基于UFS 3.1 标准文档阐述 UFS 1-UFS架构简介1 UFS 2 -UFS架构简介2 UFS 3 - UFS RPMB UFS 4 - UFS Boot UFS 5 - UFS UIC Layer: MIPI M-PHY UFS 6 - UAP – SCSI Comma…

机器人工程创新类课程补充说明-2023-2

仅供参考 之前一篇&#xff1a;机器人工程创新类课程补充说明-2023- 自主学习→自主研究→自主创新&#xff0c;这是一个循序渐进的过程&#xff0c;着急没用的&#xff0c;大部分学生&#xff0c;都卡在第一个阶段&#xff0c;自主学习的效率比较低&#xff0c;并且成果不突出…

【C++ 程序设计】第 6 章:多态与虚函数

目录 一、多态的基本概念 &#xff08;1&#xff09;多态 &#xff08;2&#xff09;虚函数 &#xff08;3&#xff09;通过基类指针实现多态 &#xff08;4&#xff09;通过基类引用实现多态 &#xff08;5&#xff09;* 多态的实现原理 二、多态实例 三、多态的使用 …

docker启动的jenkins拉取gitee项目构建并部署

docker启动的jenkins拉取gitee项目构建并部署 docker 拉取jenkins https://hub.docker.com/r可以search不同的jenkins版本docker pull jenkins/jenkins创建挂载目录 /home/jenkins_home加权限chmod 777 /home/jenkins_homedocker run -di --namejenkins -p 9999:8080 -v /hom…

【json-server】centos线上环境搭建全攻略

▒ 目录 ▒ &#x1f6eb; 问题描述环境 1️⃣ 安装json-server安装nvm安装node安装json-server 2️⃣ json-server 使用创建json数据踩坑&#xff1a;指定host关闭防火墙云后台修改安全组规则最终命令行 &#x1f6ec; 结论&#x1f4d6; 参考资料 &#x1f6eb; 问题 描述 开…

【虚拟机搭建-VMware设置固定IP】VMWare中CentOS如何设置固定IP【不成功手把手教学】

背景 在日常工作学习中&#xff08;比如博主在之前学习k8s过程中&#xff0c;windows本地搭建虚拟机&#xff0c;重启windows后&#xff09;虚拟机的IP会发生变化&#xff0c;所以该篇文章详细记录VMWare中CentOS如何设置固定IP 虚拟机安装 参考&#xff1a; https://rundr…

尚硅谷Docker2022版学习笔记(基础篇 上)

目录 一、Docker简介 1.1、是什么&#xff1f; 问题&#xff1a;为什么会有Docker出现&#xff1f; Docker理念 一句话 1.2、容器与虚拟机比较 传统虚拟机技术 容器虚拟机技术 容器虚拟机技术 1.3、去哪下&#xff1f; 二、Docker安装 2.1、前提说明 2.2、Docker的…

Rust语言从入门到入坑——(8)Rust泛型与特性

文章目录 0、引入1、泛型1.1、在函数中使用1.2、在结构体中使用 2、特性2.1 默认特性2.2 特性做参数2.3 特性做返回值2.4 有条件实现方法 3、总结 0、引入 泛型是一个编程语言不可或缺的机制。 C 语言中用"模板"来实现泛型&#xff0c;而 C 语言中没有泛型的机制&am…

MySQL数据库——备份与恢复

MySQL数据库——备份与恢复 一、数据备份的重要性二 、数据库备份的分类和备份策略1 数据库备份的分类2 数据库的备份策略3常见的备份方法 三、MySQL完全备份1 什么是完全备份2 完全备份的优缺点3 完全备份的方法 四、完全备份的操作1.物理冷备份与恢复2.mysqldump 备份与恢复3…

Arduino IDE 2.1.0 下安装ESP32

很久没玩Arduino了。新装了一台电脑&#xff0c;想重新捡起ESP32-WROOM-32开发板玩玩。官网上下了Arduino IDE 2.1.0&#xff0c;然后配置ESP32开发环境。 下载及安装Arduino IDE略过不谈。装完后还是老规矩&#xff0c;文件 -> 首选项&#xff0c;先把自定义板管理地址填入…

如何与西门子200 PLC建立连接

更多关于西门子S7-200PLC内容请查看&#xff1a;西门子200系列PLC学习课程大纲 与西门子200 PLC建立连接很简单&#xff0c;分为以下几步&#xff1a; 1.给S7-200PLC通电 按下图1-1所示连接PLC端口&#xff0c;然后给PLC供电&#xff0c;有直流24V和交流220V两种供电方式&am…

力扣----环形链表

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 金句分享:…

9i物联网浏览器(cef_114.2.110114.2.100支持H264视频)WinForm-CefSharp114(5735)视频版本体验

更新:2023.6.25 版本:Cef_114.2.110和114.2.100+chromium-114.0.5735.134的32位和64位 说明:支持图片,mp3,mp4(H264)多媒体 测试环境:windows server 2019 测试网址:www.html5test.com 1.包下载地址 1.1 https://www.nuget.org/packages/CefSharp.Common/ 1.2 https…

SpringCloud Alibaba学习笔记

SpringCloud Alibaba学习笔记 1、项目搭建 版本依赖关系&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E 1.1、搭建父工程 spring-initializr构建项目 清理父工程中不必要的文件/文件夹 修改pom.xml文件 <…

Linux进程信号【信号产生】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、进程信号基本概念1.1、什么是信号&#xff1f;1.2、信号的作用1.3、信号的…

十四、go语言的指针

一、指针 1.1 指针的概念 指针是存储另一个变量的内存地址的变量。 我们都知道&#xff0c;变量是一种使用方便的占位符&#xff0c;用于引用计算机内存地址。 一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址。 在上面的图中&#xff0c;变量b的值为156&…

怎么输入文字生成绘画图?分享一份文字生成绘画教程

你是否曾经幻想过&#xff0c;将文字化为绘画&#xff0c;将思维转化为图像&#xff0c;让你的想象力得到更好的释放与表达&#xff1f;现在&#xff0c;这一切都变得可能了&#xff01;通过一些绘画软件&#xff0c;你可以轻松生成各种风格的绘画图。只需要一个创意的想法和一…

Selenium教程__POM架构(17)

POM是Page Object Model的简称&#xff0c;它是一种设计思想&#xff0c;意思是&#xff0c;把每一个页面&#xff0c;当做一个对象&#xff0c;页面的元素和元素之间操作方法就是页面对象的属性和行为。 POM一般使用三层架构&#xff0c;分别为&#xff1a;基础封装层、页面对…

SkyWalking--traceId的作用

原文网址&#xff1a;SkyWalking--traceId的作用_IT利刃出鞘的博客-CSDN博客 简介 本文介绍SkyWalking中traceId的作用。 traceId是什么 SkyWalking的一个核心功能就是&#xff1a;链路追踪。链路追踪就是跟踪一个请求的所有链路&#xff0c;而这个链路都是通过一个id来串起…