你知道WPF这三大模板实例运用吗?

1、介绍

对于Windows桌面端应用开发来讲,WPF以其界面渲染的特殊性,灵活的界面布局而让人津津乐道,因为它能为用户提供更好的交互体验。如何利用WPF开发出让人赏心悦目的界面与功能呢?这里不仅仅只是布局的功劳,很大一部分都在WPF模板的灵活使用,那么这里就来聊一聊WPF的三大模板。

2、控件模板ControlTemplate

WPF所有控件都是基于呈现与行为分离的模式,开发人员可以在自己应用场景中根据需要进行不同呈现状态的更改,而不会影响到控件的原始功能行为,能让我们在任意改变控件外观的同时还能保留控件的操作动作,这里其实除了模板的分离还得益于WPF的路由事件(后面有机会再聊,今天就先说模板)。下面以一个控件为例,可以进行不同的模板修改。

这里我们可以直接使用窗口资源,创建一个ControlTemplate对象,呈现结果与代码如下:

 <Window x:Class="Zhaoxi.ControlTemplate.Demo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Window.Resources><ControlTemplate TargetType="Button" x:Key="ButtonTemplate1"><Border Background="Red" Width="80" Height="30" CornerRadius="5"><ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>Border>ControlTemplate><ControlTemplate TargetType="Button" x:Key="ButtonTemplate2"><Border Background="Orange" Width="80" Height="80" CornerRadius="40"><ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>Border>ControlTemplate><ControlTemplate TargetType="Button" x:Key="ButtonTemplate3"><Grid><Polygon Points="40,0 80,80 0,80" Fill="Green"/><ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>Grid>ControlTemplate>Window.Resources><UniformGrid Rows="1"><Button Content="Button1" Template="{StaticResource ButtonTemplate1}"VerticalAlignment="Center" HorizontalAlignment="Center"/><Button Content="Button1" Template="{StaticResource ButtonTemplate2}"VerticalAlignment="Center" HorizontalAlignment="Center"/><Button Content="Button1" Template="{StaticResource ButtonTemplate3}"VerticalAlignment="Center" HorizontalAlignment="Center"/>UniformGrid>Window>

三个按钮根据不同的模板进行不了同的呈现,但是原始功能依然保留,不受任何影响

3、数据模板DataTemplate

数据模板其实是为了解决数据集绑定中数据呈现的问题,它规定了数据集中数据如何布局,一般在数据集控件中使用,比如ItemsControl、ListView、ListBox、DataGrid等,下面还是以一个简单的例子来介绍:

 <Window x:Class="Zhaoxi.DataTemplate.Demo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d"xmlns:sys="clr-namespace:System;assembly=mscorlib"Title="MainWindow" Height="450" Width="800"><Window.Resources><x:Array Type="sys:String" x:Key="datas"><sys:String>ABCDEFGsys:String><sys:String>1234567sys:String>x:Array><DataTemplate x:Key="DataTemplate1"><Border BorderBrush="#DDD" BorderThickness="0,0,0,1"><Grid MinHeight="30"><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/>Grid.ColumnDefinitions><TextBlock Text="{Binding [0]}" VerticalAlignment="Center" HorizontalAlignment="Center"/><StackPanel Grid.Column="1"><TextBlock Text="{Binding [1]}" Margin="0,5"/><TextBlock Text="{Binding [2]}" Margin="0,5"/>StackPanel><TextBlock Text="{Binding [3]}" Grid.Column="2"/>Grid>Border>DataTemplate>Window.Resources><Grid><ItemsControl ItemsSource="{StaticResource datas}" ItemTemplate="{StaticResource DataTemplate1}">ItemsControl>Grid>Window>

这里的DataTemplate就规定了绑定到ItemsControl的数据集中的数据如何显示,而且被绑定的值才能显示,没有被绑定的值无法显示

4、容器模板ItemsPanelTemplate

窗口模板也是伴随送数据集合控件一起了,它规定了数据呈现的排列方式,可以通过指定不同的布局控件进行不同的布局显示,比如下面的例子介绍了以UniformGrid方式进行布局的例子

 <Window x:Class="Zhaoxi.VisualState.Demo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d"xmlns:sys="clr-namespace:System;assembly=mscorlib"Title="MainWindow" Height="100" Width="800"><Window.Resources><x:Array Type="sys:String" x:Key="datas"><sys:String>ABCDEFGsys:String><sys:String>1234567sys:String>x:Array><DataTemplate x:Key="DataTemplate1"><Border BorderBrush="#DDD" BorderThickness="1"><Grid MinHeight="30"><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/>Grid.ColumnDefinitions><TextBlock Text="{Binding [0]}" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Red"/><StackPanel Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center"><TextBlock Text="{Binding [1]}" Margin="0,5"/><TextBlock Text="{Binding [2]}" Margin="0,5"/>StackPanel><TextBlock Text="{Binding [3]}" Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Center"Foreground="Green"/>Grid>Border>DataTemplate>Window.Resources><Grid><ItemsControl ItemsSource="{StaticResource datas}" ItemTemplate="{StaticResource DataTemplate1}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><UniformGrid Rows="1"/>ItemsPanelTemplate>ItemsControl.ItemsPanel>ItemsControl>Grid>Window>

有时候有人为问我:如何让一个布局控件通过绑定的方式进行子项的动态增删?那么这个问题的奥秘就在上面这个例子中,借助一个数据集合控件,将此控件的容器模板改变成所要动态增删子项的容器就可以,不仅仅是Grid、StackPanel还包括UniformGrid、WrapPanel、DockPanel、Canvas都可以,灵活运用能得到意想不到的效果。

最后展示一个利用自定义容器的方式,进行了一个瀑布流式布局的动态数据呈现:

END

持续关注后续更新更多干货!

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

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

相关文章

如何判断程序员是在装逼还是有真本事?

程序员是一个十分特殊的群体&#xff0c;他们十分内敛、腼腆&#xff0c;但是只要一开口就能判断出来&#xff0c;到底是在装逼还是有真本事&#xff0c;不信咱们往下看&#xff01;1、这个功能是小case&#xff0c;分分钟搞定一般情况下&#xff0c;程序员在拿到一个新的功能需…

php header会重定向吗,php – 可以依靠header()重定向来结束程序流吗?

不,标题不会结束程序执行.你必须自己以退出或死亡结束它.您可以自己尝试这样的事情&#xff1a;file_put_contents(/tmp/test, 1);header(Location: http://www.emilvikstrom.se/);file_put_contents(/tmp/test, 2);?>检查/ tmp / test的内容,你会发现它是2.我也试过这个脚…

tac

tac名称&#xff1a;以相反的方式连接和打印文件&#xff0c;和cat输出的内容相反总揽:tac [Options]…… [File]……描述&#xff1a;将每个指定的文件File的内容输出到标准输出上&#xff0c;文件的最后一行最先输出&#xff0c;最先一行最后输出。若命令行中没有指定文件或指…

怎样借助Python爬虫给宝宝起个好名字

Beginning每个人一生中都会遇到一件事情&#xff0c;在事情出现之前不会关心&#xff0c;但是事情一旦来临就发现它极其重要&#xff0c;并且需要在很短的时间内做出重大决定&#xff0c;那就是给自己的新生宝宝起个名字。因为要在孩子出生后两周内起个名字&#xff08;需要办理…

CAP-分布式事务的解决方案

CAP 是一个基于 .NET Standard 的 C# 库&#xff0c;它是一种处理分布式事务的解决方案&#xff0c;同样具有 EventBus 的功能&#xff0c;它具有轻量级、易使用、高性能等特点。https://github.com/dotnetcore/CAP在我们构建 SOA 或者 微服务系统的过程中&#xff0c;我们通常…

php 初始二维数组长度,php二维数组排序与默认自然排序的方法介绍

php二维数组排序函数&#xff0c;默认自然排序&#xff0c;即sort排序。这里可以指定按二维数组中的某个值进行多种方法排序&#xff0c;具体看下面的程序注释。 代码如下:/*** function 二维数组自然排序* author www.phpernote.com* param array $array 需要排序的数组(二维)…

做操作系统的公司,为什么不能把系统安全做好?

易用和安全&#xff0c;从来都是一对矛盾&#xff0c;过分考虑方便用户操作&#xff0c;就很容易带来系统隐患。向上兼容也会带来系统的复杂性&#xff0c;复杂的系统漏洞一定多。对微软来说&#xff0c;它的每一个版本&#xff0c;都需要考虑向下兼容&#xff0c;比如Win95是3…

我是怎么用机器学习技术找到女票的

机器学习在我们生活中的用处有多大&#xff0c;就不用我们多说了&#xff0c;大到医疗诊断&#xff0c;小到手机应用&#xff0c;机器学习都应用的风风火火。但是用机器学习帮自己在学校找对象&#xff0c;你听说过吗?最近滑铁卢大学一位叫 Bai Li 的留学生(李白?应是中国同胞…

.Net5 WPF快速入门系列教程

一、概要在工作中大家会遇到需要学习新的技术或者临时被抽调到新的项目当中进行开发。通常这样的情况比较紧急没有那么多的时间去看书学习。所以这里向wpf技术栈的开发者分享一套wpf教程&#xff0c;基于.net5框架进行开发本系列每一期视频长度平均在15分钟左右&#xff0c;并利…

php 重定向数据不丢失,PHP重定向如何实现数据不丢失?

PHP重定向如何实现数据不丢失&#xff1f;首先获取要保存的数据&#xff1b;$data [username > guanhuicoder,redirect_url > ./index.phpemail > guanhuicodercode.com];然后将数据转为JSON字符串&#xff0c;并将其储存在Session中&#xff1b;$data [username &g…

数据“被”覆盖有假象,SQL数据库恢复终极绝招(数据恢复高级技术)

很多数据恢复工程师包括一些数据恢复技术爱好者经常会问同样一个问题&#xff1a;“数据一旦被覆盖了&#xff0c;还能不能恢复呀&#xff1f;我听说国外能恢复被覆盖以后的数据&#xff0c;据说只要是覆盖操作在7次以内&#xff0c;都能恢复出来&#xff0c;国内有没有这种技术…

北大教授郑也夫斗胆谈了7个天大的问题(非常狠,也很现实)

我是一个小人物&#xff0c;今天斗胆谈一个天大的问题——中国教育。中国教育是一个天大的问题&#xff0c;不是说我们有多大的本领把它办得多么好&#xff0c;而是我们居然可以把它办得这样糟&#xff0c;这是一个很沉痛的话题。——北大教授、社会学家郑也夫1不输在起跑线&am…

.NET 6 Preview 3 中 ASP.NET Core 的更新和改进

原文&#xff1a;bit.ly/2Qb56NP作者&#xff1a;Daniel Roth译者&#xff1a;精致码农-王亮.NET 6 预览版 3 现已推出&#xff0c;其中包括许多对新的 ASP.NET Core 改进。以下是本次预览版的新内容&#xff1a;更小的 SignalR、Blazor Server、MessagePack 脚本文件启用 Redi…

php 图片消除锯齿,ps如何消除边缘锯齿

PS消除边缘锯齿的方法&#xff1a;打开图片选择魔棒工具&#xff0c;在窗口中解锁图层然后将鼠标移动到背景区域&#xff0c;左键单击它再按删除键&#xff0c;然后再右键点击人像&#xff0c;选择羽化&#xff0c;将羽化半径设置为4&#xff0c;点击确定后按删除键&#xff0c…

构建根文件系统(2)Busybox init 进程

讲init进程的启动过程从/etc/inittab出发。 内核启动init进程时已经打开/dev/console设备作为控制台&#xff0c;一般情况下Busybox init程序就使用/dev/console&#xff0c; 如果内核启动init进程的同时设置了环境变量CONSOLE或console&#xff0c;则使用环境变量所指定的设备…

C#如何在Windows中操作IIS设置FTP服务器

什么是FTPFTP(File Transfer Protocol)是TCP/IP网络上两台计算机传送文件的协议&#xff0c;使得主机间可以共享文件.可以将 Internet 信息服务 (IIS) 配置为作为 FTP 服务器来运行。 这样&#xff0c;其他计算机便可以连接到服务器并将文件复制到服务器或者从服务器复制文件。…

这是一份编程宝典,请查收!

最近&#xff0c;小编一直在整理有关编程的书籍&#xff0c;有Android、C、Java、PHP、木马、算法等类型的书籍。现在&#xff0c;小编准备将这些资料免费分享给大家&#xff01;Android应用开发入门教程&#xff08;经典版&#xff09;易学CC语言解惑HTML入门教程Java解惑&…

php备份和恢复源码,PHP数据库备份还原类

php代码<?php /*** 数据库备份还原类* author xialeistudio* date 2014-03-17* Class DatabaseTool*/class DatabaseTool{private $handler;private $config array(host > localhost,port > 3306,user > root,password > ,database > test,charset > ut…

2011年Android手机用户购买行为研究报告

http://mobile.51cto.com/hot-292153.htm转载于:https://blog.51cto.com/jueshishenhua/670081

以IP段作为监听地址

在写Socket通讯服务的时候一般需要Listen某个IP地址端口&#xff0c;但这样比较麻烦的就是部署后需要配置相关IP地址信息&#xff1b;虽然可以监听Any所有地址&#xff0c;但这种对于私有的网络服务来说并不安全。为了在发布的时候节省一些配置工作所以才想到以IP段作为监听地址…