Silverlight实例秀——可切换视图的DataTemplate(做网站必备技术)

news/2024/5/17 12:11:52/文章来源:https://blog.csdn.net/weixin_34082854/article/details/90064389
小序:
敏捷开发也是要有个度的。搞敏捷,最起码的限度是程序员要对手里使用的工具比较精通。
相信大家都见过这个场景:
问:“你在做什么?”
程序员:“我在敏捷开发。”
问:“这样设计不对吧……”
程序员:“没事儿,我可以重构!”
拜托,手里使用的工具都不了解,程序中到处都是诡异的方法……怎么重构?天生就是一恐龙,再怎么重构也变不成人呀!这时候,唯一能做的就是——重写。
正文:
今天的例子就是一个由错误程序重写而来的结果。至于那个错误程序,下周我将另写一文《WPF的典型误用》。
客户的需求是这样的:要求用Silverlight写一个留言板,打开界面后,可以看到一个留言列表,每条留言只显示标题、发言人和发言时间。每条留言有一个切换按钮,可以显示和隐藏留言的详细信息。
实现这个功能很简单。用一个ListBox加上一个DataTemplate就搞定了。这里着重提示一句:DataTemplate就是“数据的外衣”,只有理解了DataTemplate才能明白WPF的精髓——数据驱动UI,也才能可能准确地使用MVVM模式。
下面让我们看代码。
页面的设计很简单——Title和ListBox。Load按钮用来加载模拟数据。模拟数据的类型是自定义类Message。
  1. <UserControl x:Class="SilverlightApplicationBBS.Page"
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  4.     Width="600" Height="366">
  5.     <StackPanel x:Name="LayoutRoot" Background="LightBlue">
  6.         <!--Title-->
  7.         <StackPanel Orientation="Horizontal">
  8.             <TextBlock Text="Silverlight Mini BBS" FontSize="24" Margin="5" VerticalAlignment="Bottom"/>
  9.             <TextBlock Text="Powered by: 水之真谛" Width="200"  VerticalAlignment="Bottom" Margin="10"/>
  10.             <Button Content="Load"  Height="23" Width="75" VerticalAlignment="Bottom" Margin="10" Click="LoadButton_Click" />
  11.         </StackPanel>
  12.         <!--Content-->
  13.         <ListBox x:Name="listBox" Margin="10" Height="300" />
  14.     </StackPanel>
  15. </UserControl>
自定义Message类:
  1.     public class Message
  2.     {
  3.         public string Title { getset; }
  4.         public string OpenedBy { getset; }
  5.         public string OpenTime { getset; }
  6.         public string Content { getset; }
  7.     }
运行起来是这样:
让我们看看Load按钮的Click事件处理器:
  1.         private void LoadButton_Click(object sender, RoutedEventArgs e)
  2.         {
  3.             // 造些假数据。项目中数据来自数据库
  4.             List<Message> msgList = new List<Message>();
  5.             for (int i = 0; i < 30; i++)
  6.             {
  7.                 Message msg = new Message()
  8.                 {
  9.                     Title = "Message Title " + i.ToString(),
  10.                     OpenedBy = (i % 2 == 0) ? "Tom" : "Tim",
  11.                     OpenTime = DateTime.Now.ToShortDateString(),
  12.                     Content = (i % 2 == 0) ? "水之真谛" : @"http://blog.csdn.net/FantasiaX"
  13.                 };
  14.                 msgList.Add(msg);
  15.             }
  16.             this.listBox.ItemsSource = msgList;
  17.         }
点击Load后,效果是这样的:
咦?怎么显示的是数据类型呢?
是啊!你不给数据穿好“衣服”,人家怎么知道如何show给你呢?
让我们给Message数据穿上一身合适的衣服!也就是给ListBox配上合适的ItemTemplate。注意:ListBox的Item是Message,而不是ListBoxItem控件。当你把一列Message设置为ListBox的ItemsSource时,ListBox会自动为每个Message生成一个容器(ListBoxItem)——WPF中所有ItemsControl都有自己对应的Item容器,比如ListView的Item容器是ListViewItem。特别提醒一点:一个好的数据驱动UI的程序,你完全用不着显式地为ItemsControl添加Item容器,如果你发现有这样的代码,那八成是没理解“数据驱动UI”,或者说又拿WPF当WinForm使了
这是添加好DataTemplate后的XAML代码:
  1. <UserControl x:Class="SilverlightApplicationBBS.Page"
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  4.     Width="600" Height="366">
  5.     <UserControl.Resources>
  6.         <!--DataTemplate-->
  7.         <DataTemplate x:Key="messageTemplate">
  8.             <StackPanel>
  9.                 <StackPanel Orientation="Horizontal" Height="23">
  10.                     <TextBlock Text="Title:" Width="40" VerticalAlignment="Center" />
  11.                     <TextBox Text="{Binding Path=Title}" Width="180"/>
  12.                     <TextBlock Text="By:" Width="30" VerticalAlignment="Center" />
  13.                     <TextBox Text="{Binding Path=OpenedBy}" Width="80"/>
  14.                     <TextBlock Text="At:" Width="30" VerticalAlignment="Center" />
  15.                     <TextBox Text="{Binding Path=OpenTime}" Width="80"/>
  16.                     <Button Content="Switch" Width="75" Margin="20, 0,0 0" Click="Button_Click"/>
  17.                 </StackPanel>
  18.                 <StackPanel x:Name="detailPanel" Orientation="Horizontal" Height="60" Visibility="Collapsed">
  19.                     <TextBox Margin="40,5,10,5" Text="{Binding Path=Content}" Width="400"/>
  20.                 </StackPanel>
  21.             </StackPanel>
  22.         </DataTemplate>
  23.     </UserControl.Resources>
  24.     <StackPanel x:Name="LayoutRoot" Background="LightBlue">
  25.         <!--Title-->
  26.         <StackPanel Orientation="Horizontal">
  27.             <TextBlock Text="Silverlight Mini BBS" FontSize="24" Margin="5" VerticalAlignment="Bottom"/>
  28.             <TextBlock Text="Powered by: 水之真谛" Width="200"  VerticalAlignment="Bottom" Margin="10"/>
  29.             <Button Content="Load"  Height="23" Width="75" VerticalAlignment="Bottom" Margin="10" Click="LoadButton_Click" />
  30.         </StackPanel>
  31.         <!--Content-->
  32.         <ListBox x:Name="listBox" Margin="10" Height="300" ItemTemplate="{StaticResource messageTemplate}"/>
  33.     </StackPanel>
  34. </UserControl>
点击Load,这回看到的界面就对了!
然后尝试点击每个Switch按钮——视图能够切换:
这一点是怎么做到的呢?
原来,秘密是在DataTemplate里Switch按钮的处理函数中:
  1.         // 切换视图
  2.         private void Button_Click(object sender, RoutedEventArgs e)
  3.         {
  4.             // Silverlight里的VisualTreeHelper功能受限,所以只能这样做。WPF里的就方便多了。
  5.             Button b = sender as Button;
  6.             StackPanel p = VisualTreeHelper.GetParent(b) as StackPanel;
  7.             p = VisualTreeHelper.GetParent(p) as StackPanel;
  8.             p = p.FindName("detailPanel"as StackPanel;
  9.             if (p.Visibility == Visibility.Collapsed)
  10.             {
  11.                 p.Visibility = Visibility.Visible;
  12.             }
  13.             else
  14.             {
  15.                 p.Visibility = Visibility.Collapsed;
  16.             }
  17.         }
只是Silverlight为了“减肥”,把很多VisualTreeHelper的功能都给砍了,这样我们就只能手动地去找到需要显示/隐藏的UI元素了。
你可能会问:那么多记录,每条上都有一个Switch按钮,是不是需要写一个循环,把它们的Click事件与Button_Click函数关联起来呀?
答案是:No!当你把一列数据赋值给ListBox.ItemsSource时,ListBox会按照自己的ItemTemplate(即我们设计的DataTemplate)逐个处理自己的Item。
到此,功能就已经实现了。如果觉得UI不是很漂亮,那就交给我们的designer,他们会给整个程序穿上漂亮的外衣。
下面的图是我请团队主力设计师之一Owen进行美化后的结果,请大家欣赏!




本文转自 水之真谛 51CTO博客,原文链接:http://blog.51cto.com/liutiemeng/121346,如需转载请自行联系原作者

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

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

相关文章

tomcat网站根目录在哪里_千岛湖网站SEO公司哪里有,360SEO优化_万推霸屏

首页 > 新闻中心发布时间&#xff1a;2020-11-11 16:49:59 导读&#xff1a;万推霸屏为您提供千岛湖网站SEO公司哪里有,360SEO优化的相关知识与详情&#xff1a; 事实上&#xff0c;我们的技术太复杂&#xff0c;这带来了巨大的技术障碍。在进行优化的时候我们需要注意的是要…

用jekyll制作高大上的网站(一)——安装与配置

很多人会制作自己的主页&#xff0c;页面美观简洁&#xff0c;一直很在意是怎么做的。 最近公司需要做个文档库的主页&#xff0c;就研究了一些开源的工具&#xff0c;后面发现了jekyll&#xff08;读杰克尔&#xff09;&#xff0c;将纯文本转换为静态博客网站。 一、Ruby jek…

大型网站运维探讨和心得(转载)

2019独角兽企业重金招聘Python工程师标准>>> 看到一篇不错的心得体会&#xff1b;相信我们做技术的都会有或多或少的担忧自己的未来职业发展&#xff1a; 今天看到一篇心得体会&#xff0c;转过来和大家一起探讨一下&#xff1a; 一、什么是大型网站运维? 首先明确…

计算机安全知识百度,seo百度_计算机专业基础知识包括哪些内容? 计算机网络与安全基础知识...

可选中1个或多个下面的关键词&#xff0c;搜索相关资料。也可直接点“搜索资料”搜索整个问题。我是计算机专业的&#xff0c;它分为软件和硬件&#xff0c;硬件电路基础&#xff0c;电子电路&#xff0c;电脑组装&#xff0c;CPU 芯片。显卡。声卡。微机接口&#xff1b;软件c…

动态网站设计——笔记

rowspan 使用时 逐一使用可以避免多出一行 脑子多运动一点 clospan 合并行 一样的 <table style"width: 100%;"><tr><td rowspan"3"><img alt"" src"images/Screenshot_2022_0416_184734.png" style"heigh…

服务器被黑了做非法网站,网站被黑如何处理

日常生活中&#xff0c;偶尔会遇到网站被恶意植入非法信息的可能&#xff0c;那么遇到这种情形我们要以什么样的方式来判断网站是否被黑了呢&#xff1f;一、以下就是网站被黑的处理方法&#xff1a;1.可以联系主机提供商&#xff0c;对方做出应对。2.处理一些被修改过的文件。…

php url优化,PHP SEO优化之URL优化方法

PHP SEO优化之URL优化方法复制代码 代码如下:function getSeoVersion($phrase) {return preg_replace(/[^a-z0-9_-]/i, , strtolower(str_replace( , -, trim($phrase))));}// example usage:echo getSeoVersion("German cars are amazing.");时间&#xff1a; 2011-…

企业网站需要什么样内容才能满足和吸引到用户?

当今互联网发展趋势锐不可当&#xff0c;网速从2g即将迈向5g&#xff0c;随着用户的口味复制多变&#xff0c;“内容为王”应运而生逐渐被认可。既然内容那很重要&#xff0c;那企业建站过程如何进行网站内容建设呢&#xff1f;那企业网站又需要什么样内容才能满足和吸引到用户…

你的PPT花费的时间总是很多吗?这5个网站让你效率提高五倍以上

你做幻灯片的时候花费的时间是不是很多呢&#xff1f;是不是想要做一份适合职场的专业PPT总是要费尽心思呢&#xff1f;接下来我就要给大家介绍五个网站&#xff0c;绝对能让你效率提高五倍以上&#xff01;一、求字体网如果你觉得PPT自带的字体太单调了&#xff0c;想要应用新…

【pink老师--前端经典面试题】mouseover与mouseenter的区别。

mouseover与mouseenter都是上鼠标经过事件&#xff0c;在鼠标经过时触发。两者有什么区别呢 看下面代码演示。 代码的意思是父盒子里面有一个小盒子。给父盒子绑定mouseover事件&#xff0c;按道理给父盒子 绑定的事件&#xff0c;应该只有父盒子执行才对&#xff0c;但事实并…

前端进阶(做网站必备)----SEO网站优化

SEO汉译为搜索引擎优化&#xff0c;是一种利用搜索引擎的规则提高网站在有关搜索引擎内自然排名 的方式&#xff0c;换而言之就是优化后能更容易被用户搜索到。 主要从三方面优化 1、title网站标题 优化建议&#xff1a; 网站名-网站介绍。 2、description网站说明 优化建…

【仿小米商城网站】html+css 源码和效果图

导航栏鼠标经过样式&#xff1a; 侧边栏鼠标经过样式&#xff1a; 主体部分&#xff1a; 底部区域&#xff1a; 想要源码的可以留言评论哦

《网站说服力——营销型网站策划》

《网站说服力——营销型网站策划》 基本信息 作者&#xff1a; 谢松杰 出版社&#xff1a;电子工业出版社 ISBN&#xff1a;9787121221255 上架时间&#xff1a;2014-1-18 出版日期&#xff1a;2014 年1月 开本&#xff1a;16开 页码&#xff1a;352 版次&#xff1a;1-1 所…

Firefox 66 发布,阻止网站自动播放声音

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; Firefox 66 发布了&#xff0c;此版本在桌面版中带来的新特性包括&#xff1a; Firefox 现在阻止网站自动播放声音&#xff0c;如果需要可以单独调整改进的搜索体验&#xff1a; 当打开许多选项…

网站服务器p2p更新需要多久,《彩虹六号》更新计划 将升级服务器并移除P2P功能...

《彩虹六号&#xff1a;围攻(Rainbow Six:Siege)》2.2.2更新补丁将在2017年8月9日于全平台实装。将添加最低两名玩家即可游戏的自定义比赛专属服务器、猎杀恐怖分子模式专属服务器以及其他方面的调整&#xff0c;同时在官方公告育碧透露了接下来游戏的一系列部署计划。在公告中…

kali下Burpsuite对网站后台注入php木马

先给kali浏览器设置代理 后面输入你的端口号 打开后&#xff0c;先关闭拦截 因为i我们只要拦截重要的就行了 接下来打开浏览器 访问我们搭建的网站 这时在点击开始拦截就可以了 右键空白 send to repeater 送往中继器 因为中继器是可以改包的 然后你切换到Burp的中继器 你就…

抖音怎么在电脑上看_抖音直播网站怎么复制到电脑,电脑版抖音直播步骤?

编辑&#xff1a;胥伟易社嗨&#xff01;大家好&#xff0c;我是易社&#xff0c;今天给大家分享的标题是&#xff1a;“抖音直播网站怎么复制到电脑&#xff0c;电脑版抖音直播步骤”&#xff0c;话不多说&#xff0c;往下看&#xff01;1.首先在手机上打开抖音&#xff0c;点…

python astype category_python数据分析实例:python抓取课工厂网站数据和分析

在线教育网站学习&#xff0c;是很多人利于闲余时间进行充电的一种选择。本篇文章利用python抓取在线教育网站课工场课程页面的数据,进行简要分析。通过使用requests库对课工场课程列表页进行抓取。通过BeautifulSoup对课工场课程列表页面进行解析&#xff0c;并从中获课程名称…

如何防止通过url攻击_什么是CC攻击,如何防止网站被CC攻击的方法总汇

CC攻击&#xff08;Challenge Collapsar&#xff09;是DDOS&#xff08;分布式拒绝服务&#xff09;的一种&#xff0c;也是一种常见的网站攻击方法&#xff0c;攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包&#xff0c;造成对方服务器资源耗尽&#xff0c;一直…

如何评定一个搜索引擎的好和坏_如何判断一个网站SEO优化的好坏

在对网站seo优化时通常要分析竞争对手&#xff0c;那如何判断一个网站SEO优化的好坏呢&#xff1f;以下列出的就是判断一个网站SEO优化好坏的标准&#xff0c;通过这些能看出这个网站SEO优化的质量。1、关键词与网站的内容是否息息相关?2、关键词是否是搜索引擎查询中常用的词…