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

news/2024/5/8 13:55:58/文章来源:https://blog.csdn.net/FantasiaX/article/details/3551231

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

 

小序:

敏捷开发也是要有个度的。搞敏捷,最起码的限度是程序员要对手里使用的工具比较精通。

相信大家都见过这个场景:

问:“你在做什么?”
程序员:“我在敏捷开发。”
问:“这样设计不对吧……”
程序员:“没事儿,我可以重构!”

拜托,手里使用的工具都不了解,程序中到处都是诡异的方法……怎么重构?天生就是一恐龙,再怎么重构也变不成人呀!这时候,唯一能做的就是——重写。

 

正文:

 

今天的例子就是一个由错误程序重写而来的结果。至于那个错误程序,下周我将另写一文《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进行美化后的结果,请大家欣赏!

 

 

 

最后,祝大家周末快乐!(这里是源码http://download.csdn.net/source/885340,感谢Tom上传!)

 

=====================================================

友情链接:

Owen同学的设计站 http://www.wangkun2008.com/

Owen同学是我们团队里的主力designer之一,我的一些程序就是由Owen同学美化的。谢谢Owen!

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

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

相关文章

python 爬取数据还要下载scrapy吗_在Python3.5下安装和测试Scrapy爬网站

本帖最后由 xandy 于 2017-3-2 16:13 编辑1. 引言Scrapy框架结构清晰&#xff0c;基于twisted的异步架构可以充分利用计算机资源&#xff0c;是爬虫做大的必备基础。本文将讲解如何快速安装此框架并使用起来。2. 安装Twisted2.1 同安装Lxml库(参考《为编写网络爬虫程序安装Pyth…

在PEA上海做演讲主题:大型、高负载网站架构和应用初探

主题&#xff1a;大型、高负载网站架构和应用初探时间&#xff1a;30-45分钟 开题&#xff1a;163,sina,sohu等网站他们有很多应用程序都是PHP写的&#xff0c;为什么他们究竟是如何能做出同时跑几千人甚至上万同时在线应用程序呢? 挑选性能更好web服务器 单台 Apache web se…

通过避免下列 10 个常见 ASP.NET 缺陷使网站平稳运行(转载)

ASP.NET 成功的其中一个原因在于它降低了 Web 开发人员的门槛。即便您不是计算机科学博士也可以编写 ASP.NET 代码。我在工作中遇到的许多 ASP.NET 开发人员都是自学成材的&#xff0c;他们在编写 C# 或 Visual Basic 之前都在编写 Microsoft Excel 电子表格。现在&#xff0c;…

网站最大并发数以及服务器配置预估

一.评测网站常用的一些术语&#xff1a; 以www.qq.com为例子&#xff0c;我们可以在站长之家输入www.qq.com获得结果&#xff1a; 日均ip&#xff1a;每天有多少个ip访问qq&#xff0c;我们可以看到qq是接近六千万&#xff0c;然后用的人远不止这些&#xff0c;因为如果在一个…

大型网站架构演变和知识体系

在这篇文章中将阐述一个普通的网站发展成大型网站过程中的一种较为典型的架构演变历程和所需掌握的[urljavascript:;]知识[/url]体系&#xff0c;希望能给想从事互联网行业的同学一点初步的概念&#xff0c;:)&#xff0c;文中的不对之处也请各位多给点建议&#xff0c;让本文真…

优化网站设计(十一):避免重定向

前言 网站设计的优化是一个很大的话题,有一些通用的原则,也有针对不同开发平台的一些建议。这方面的研究一直没有停止过&#xff0c;我在不同的场合也分享过这样的话题。 作为通用的原则&#xff0c;雅虎的工程师团队曾经给出过35个最佳实践。这个列表请参考 Best Practices f…

普通电脑可以搭建时序数据库吗_如何搭建网站?网站建设需要做哪些准备?

搭建一个网站需要哪些准备&#xff1f;如何搭建属于自己的网站&#xff1f;今天蝈蝈录制了一个视频&#xff0c;从域名注册、域名备案、域名解析、服务器购买、服务器配置搭建、上传代码等方面全过程讲解如何搭建一个网站。如果你是专业人士&#xff0c;请忽略&#xff0c;如果…

大型网站的灵魂——性能

前言 在前一篇随笔《大型网站系统架构的演化》中&#xff0c;介绍了大型网站的演化过程&#xff0c;期间穿插了一些技术和手段&#xff0c;我们可以从中看出一个大型网站的轮廓&#xff0c;但想要掌握设计开发维护大型网站的技术&#xff0c;需要我们一步一步去研究实践。所以我…

购物网站讨论1:关于模型那些事

写在最前面&#xff1a;购物网站案例下载 -------------------------------------- 1.这些类对应的业务实体是什么&#xff1f; 2.如何实现数据库连接&#xff1f; 3.类之间的关系是如何的&#xff1f; 4.如何启动数据库迁移&#xff1f; 百度自学知识点&#xff1a;启用自动数…

访问页面要看什么数据包_SEO怎么对页面标题优化,页面优化要注意什么?

页面的标题主要是规定了一些网页的内容&#xff0c;然后去告诉搜索引擎蜘蛛这个页面的大概内容&#xff0c;页面标题也就是搜索引擎来判断页面内容的主要参考信息&#xff0c;这就是网页优化最重要的因素。SEO去优化页面标题可以从下面几方面入手(1)相关且准确每个页面标题都要…

linux服务器打包文件,linux系统怎么进行文件打包_网站服务器运行维护,linux,文件...

linux系统怎么打开终端_网站服务器运行维护linux系统打开终端的方法是&#xff1a;1、使用快捷键【ctrlaltt】打开终端&#xff0c;linux支持多终端&#xff0c;可以一次性打开多个终端&#xff1b;2、通过【search your computer】功能搜索terminal。打包(.tar):tar -cvf Pro.…

建立安全审计用户_高校数据安全解决方案-网站版

一、 背景介绍高校网络中的数据一般包括网站数据、教学资源、图书资源、教务管理数据、办公资源、财务管理数据等&#xff0c;如教职工信息、学生信息、教学信息、科研信息、资产信息、图书借阅信息、师生消费信息和上网信息等各种数据内容。学校的招生就业、财务、资产数据等等…

idm 爬取网站 跳转路径_使用IDM批量抓取音效素材下载

IDM下载器的站点抓取功能&#xff0c;能够抓取网站上的图片、音频、视频、PDF、压缩包等等文件。更重要的是&#xff0c;能够实现批量抓取操作&#xff0c;省时省力。今天就来看一下&#xff0c;如何用IDM巧妙的批量抓取音效素材。1、进入音效合辑界面&#xff0c;复制链接地址…

html 树形结构_做SEO如何优化网站结构提高网站排名

做SEO如何优化网站结构提高网站排名&#xff1f;最近刚进一家新公司&#xff0c;职位是SEO优化主管。接手工作后&#xff0c;看了看自己负责的网站&#xff0c;说句实话&#xff0c;真心不想看。整个网站的界面用户体验太差了&#xff0c;打开网站给我的第一感觉就是这个网站是…

Eclipse 发布到网站的附加产品的形式 Update Site

Eclipse 发布到网站的附加产品的形式 Update Site 通过Update Site Project项目将自己做的插件产品公布到公网上&#xff0c;给客户或其它測试人员下载和应用&#xff0c;这样自己的插件就以网站的形式暴露给公众了&#xff0c;谁都能够下载下来试用它。 1. 创建Plug-inProject…

单机网站服务器,端游【天之炼狱241】单机版一键端网单+GM工具

虚拟机&#xff1a;root 密码&#xff1a;123456数据库&#xff1a;root 密码&#xff1a;root虚拟机IP&#xff1a;192.168.1.123&#xff0c;如果不是的自己ifconfig查看重要的事情说三遍&#xff0c;虚拟机IP已改好。不用改。不用改。不用改。VM虚拟机里IP也不改。建立成…

网页测速 php,好用实用的站长测速工具网站大全

文章介绍&#xff1a;其实站长一直都需要一些测速的工具&#xff0c;例如&#xff1a;网站的速度测试、ping值测试、IP是否被X测试、备案测试等等&#xff0c;本文总结了这些内容&#xff0c;分享给大家。IPIPNET网址&#xff1a;https://tools.ipip.net/newping.php支持全国Pi…

linux桌面进程怎么通信,FIFO - Linux 进程通信(System V)_Linux编程_Linux公社-Linux系统门户网站...

一.一些简单理解&#xff1a;我们知道管道是没有标志的&#xff0c;所以只能是在同一个进程组中进行通信&#xff0c;不同的祖先产生的进程之间是不可以的&#xff01;&#xff01;所以此处引入FIFO机制同样也只能是单流的&#xff01;不同的是FIFO是有标志的&#xff01;每个F…

与虫子尾交3d动画网站_HTML5 3D环形方块翻转动画

插件简介今天给大家带来的这款方块动画是基于HTML5 Canvas的&#xff0c;它的特点是许多个方块围成一个环形&#xff0c;每个方块不停地旋转&#xff0c;同时你也可以拖拽鼠标来看环形方块的不同视角&#xff0c;如果你是在移动设备上观看在线演示&#xff0c;那么你也可以滑动…

Windows下搭建Wordpress博客网站

一&#xff1a;安装wamp Windows下的ApacheMysql/MariaDBPerl/PHP/Python&#xff0c;一组常用来搭建动态网站或者服务器的开源软件&#xff0c;本身都是各自独立的程序&#xff0c;但是因为常被放在一起使用&#xff0c;拥有了越来越高的兼容度&#xff0c;共同组成了一个强大…