浅谈WPF本质中的数据和行为

时间:2022-09-22 17:39:52

WPF缩写为Windows Presentation Foundation的缩写,本文所要谈的就是WPF本质中的数据和行为,希望通过本文能对大家了解WPF本质有所帮助。

如果自己来做一个UI框架,我们会首先关注哪些方面?我想UI框架主要处理的一定包括两个主要层次的内容,一个是数据展现,另一个就是数据操作,所以UI框架必须能够接收各种不同的数据并通过UI界面展现出来,然后可以通过控件行为来操作这些数据,也就是UI框架的数据(Data)和行为(Behavior)。

本篇从总体上讲解一下WPF如何处理和操作Data,看完之后大家应该对WPF框架如何把数据转变为展现界面有初步的认识,这也是WPF本质的核心设计之一。

数据(Data)

以前的UI框架的控件对控件数据类型都有规定,按钮上显示的是文本或者加上一个图片,下拉框显示的都是字符串或者带上一个object类型属性的作为保存对象引用用。而WPF则不同,它缺省的数据类型为object,这就允许控件能够操作任意类型的数据,这也是它灵活和强大的地方之一。

数据类型

原始数据:字符串、布尔、整形等

列表数据:数组、列表等,集合中的内容可以是相同类型或者不同类型的数据

层级数据:树、列表的列表或者图等,具有层级关系的数据

组合数据:包含以上多种数据的数据,如用户联系方式包括电话、地址1、地址2、手机号等

但是如果是object类型,那WPF如何知道具体该如何显示这些数据呢?这就要通过Templates、Presenters、Binding and Converters、Layout和Styles了。

模板(Templates)

浅谈WPF本质中的数据和行为

控件模板(control template):控件模板定义一个控件的外观,这个控件主要和UI相关,一般也不和Data有关。每个控件都有个一个缺省的控件模板。

  1. <ControlTemplate x:Key=”buttonTemplate”>
  2. <Grid>
  3. <Ellipse Width=”100” Height=”100”>
  4. <Ellipse.Fill>
  5. <LinearGradientBrush StartPoint=”0,0” EndPoint=”0,1”>
  6. <GradientStop Offset=”0” Color=”Blue”/>
  7. <GradientStop Offset=”1” Color=”Red”/>
  8. </LinearGradientBrush>
  9. </Ellipse.Fill>
  10. </Ellipse>
  11. <Ellipse Width=”80” Height=”80”>
  12. <Ellipse.Fill>
  13. <LinearGradientBrush StartPoint=”0,0” EndPoint=”0,1”>
  14. <GradientStop Offset=”0” Color=”White”/>
  15. <GradientStop Offset=”1” Color=”Transparent”/>
  16. </LinearGradientBrush>
  17. </Ellipse.Fill>
  18. </Ellipse>
  19. </Grid>
  20. </ControlTemplate>

数据模板(data template):数据模板负责定制任何一个.Net对象的外观,这对于非UIElement控件非常重要,非UIElement控件的默认模板仅仅是一个TextBlock,其中包含了一个由ToString方法反会的字符串。

浅谈WPF本质中的数据和行为

  1. <ListBox x:Name=”pictureBox” ItemsSource=”{Binding Source={StaticResource photos}}” …>
  2. <ListBox.ItemTemplate>
  3. <DataTemplate>
  4. <Image Source=”placeholder.jpg” Height=”35”/>
  5. </DataTemplate>
  6. </ListBox.ItemTemplate>
  7. </ListBox>

大家可以通过工具ShowMeTheTemplate 来查看一下现有控件的默认模板。

内容控件(Presenters)

通过Templates讲解,我们现在知道控件模板定义控件外观,数据模板定义特定的数据如何显示,那么现在如何将定义的数据显示在控件外观上显示呢?那就需要content presenter了。每个控件都有一个默认的ContentPresenter用于显示Content内容,我们称这种控件为内容控件,ContentPresenter负责将ContentControl的Content属性显示出来,如以下代码示例:

浅谈WPF本质中的数据和行为

  1. <Grid> 
  2.         <Grid.Resources> 
  3.             <Style TargetType="Label"> 
  4.                 <Setter Property="Template"> 
  5.                     <Setter.Value> 
  6.                         <ControlTemplate TargetType="Label"> 
  7.                             <Grid> 
  8.                                 <Ellipse Margin="34,45,44,117" Fill="{TemplateBinding Background}"/> 
  9.                                 <ContentPresenter Content = {TemplateBinding Content}" HorizontalAlignment="Center" 
  10.                             VerticalAlignment="Center"/> 
  11.                             </Grid> 
  12.                         </ControlTemplate> 
  13.                     </Setter.Value> 
  14.                 </Setter> 
  15.             </Style> 
  16.         </Grid.Resources> 
  17.         <Label Background="Red" Content="hello wpf control"></Label> 
  18.     </Grid> 

绑定(Binding) 和 转换(Converters)

数据模板描述了数据显示的外观,我们如何使得这些外观和数据关联起来呢?这就是数据绑定(data binding)来做的事情。WPF的数据绑定是一个强大的功能,它允许单项和双向的绑定,当对象更改时UI会自动刷新,当UI操作后数据也可以自动更改。

浅谈WPF本质中的数据和行为

有时候数据的格式并不只是简答的显示,比如bool类型需要显示成三态,可以通过一个转换器来实现。

Binding和Converters代码示例:网上很多这个资料,可以参考WPF Data Binding、Binding Converters

布局(Layout)

经过前面的步骤,模板已经定义了,数据也有了,转换器和绑定也触发了,内容显示也生成了,剩下最后一步就是布局(layout)。布局系统将确定前面生产的所有UI控件的大小和位置。在WPF中panel以及其继承类负责提供layout功能。布局是一种递归的分两个步骤进行的过程,第一步叫做检测(measuer),第二步叫做排列(arrange)。

检测:面板询问其子元素到底需要多少空间,这里假设有足够的控件。面板会重载FrameworkElement的MeasureOverride方法来实现这一步。

排列:在检测步骤完成后,就该排列元素了。面板会告诉子元素它们将放在哪里,它们有多少空间可以用。面板会重载FramworkElement的ArrangeOverride方法来实现这一步骤。

样式(Style)

样式是一种简单的机制,通过它可以把属性值和用户界面元素分类开来,有点类似CSS与HTML的关系

以上内容可以表达为下图:Person数据经过控件模板、数据模板以及样式和布局,再加上数据绑定就可以展现数据了。

浅谈WPF本质中的数据和行为

行为(Behavior)

把数据显示出来只是做了一半工作,还有一半就是提供用户方式与UI进行交互。下图说明了输入操作示意图:

浅谈WPF本质中的数据和行为

WPF控件支持鼠标、键盘和写字板等输入设备来与UI进行交互,还可以通过外部和内部时间进行操作,经过触发后可以通过事件处理或者command机制来进行Action。

原文标题:WPF - 本质:数据和行为

链接:http://www.cnblogs.com/zhoujg/archive/2009/11/19/1605424.html

浅谈WPF本质中的数据和行为的更多相关文章

  1. 浅谈Entity Framework中的数据加载方式

    如果你还没有接触过或者根本不了解什么是Entity Framework,那么请看这里http://www.entityframeworktutorial.net/EntityFramework-Arc ...

  2. 浅谈WPF中对控件的位图特效(WPF Bitmap Effects)

    原文:浅谈WPF中对控件的位图特效(WPF Bitmap Effects) -------------------------------------------------------------- ...

  3. 浅谈WPF页间导航

    浅谈WPF页间导航 使用导航的目的是从一个页面进入到另一个页面.无论是预先决定的线性顺序(向导)还是基于层次的用户驱动程序(大部分网站的形式),或者动态生成的路径,主要有3种方法实现:调用Naviga ...

  4. 转:浅谈C&sol;C&plus;&plus;中的指针和数组(一)

    再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...

  5. 浅谈WPF依赖项属性

    浅谈WPF依赖项属性 0. 引言 依赖项属性虽然在使用上和CLR属性一样,但是它是WPF特有的,不同于CLR属性.只是封装为我们常用CLR的属性,在语法使用上和CLR属性一样.WPF中一些功能:动画, ...

  6. c&num;Winform程序调用app&period;config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门&lpar;一&rpar;----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  7. 浅谈C&plus;&plus;11中的多线程(三)

    摘要 本篇文章围绕以下几个问题展开: 进程和线程的区别 何为并发?C++中如何解决并发问题?C++中多线程的基本操作 浅谈C++11中的多线程(一) - 唯有自己强大 - 博客园 (cnblogs.c ...

  8. 浅谈C&plus;&plus;11中的多线程(二)

    摘要 本篇文章围绕以下几个问题展开: 进程和线程的区别 何为并发?C++中如何解决并发问题?C++中多线程的基本操作 浅谈C++11中的多线程(一) - 唯有自己强大 - 博客园 (cnblogs.c ...

  9. 转: 浅谈C&sol;C&plus;&plus;中的指针和数组(二)

    转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...

随机推荐

  1. 【java基础学习】GUI

    GUI 容器 布局管理器 组件 菜单 事件处理机制

  2. ubuntu 忘记用户名及密码解决办法

    1.重启系统 2.长按Shift键,直到出现菜单.选择recovery mode,即恢复模式 3.选择root  4.# 后面敲入 cat /etc/shadow 查看用户名 5.# passwd & ...

  3. HTML5管理与实际历史的分析&lpar;history物&rpar;

    HTML5新进入历史的管理,更新history对象允许国家的经营历史更方便. 在现代Web应用.用户"前进"和"退却"button切换历史页面.这使得新的页码不 ...

  4. 我的第一个python web开发框架(3)——怎么开始?

    小白与小美公司经过几次接触商谈,好不容易将外包签订了下来,准备开始大干一场.不过小白由于没有太多的项目经验,学过python懂得python的基本语法,在公司跟着大家做过简单功能,另外还会一些HTML ...

  5. SASS 中变量的默认值

    SASS 中定义的变量,后设置的值会覆盖旧的值. $color: red; $color: blue; .btn { color: $color; } 编译后为: .btn { color: blue ...

  6. Codeforces 1032 - A&sol;B&sol;C&sol;D&sol;E - &lpar;Undone&rpar;

    链接:http://codeforces.com/contest/1032/ 是真的真的真的忍不住想吐槽这题意是真的真的真的读不懂…… A - Kitchen Utensils - [简单数学题] 题 ...

  7. &lbrack;LeetCode&rsqb; 286&period; Walls and Gates&lowbar;Medium tag&colon; BFS

    You are given a m x n 2D grid initialized with these three possible values. -1 - A wall or an obstac ...

  8. 在为shader program pass uniform之前一定要先use program。

    在为shader program pass uniform之前一定要先use program.

  9. uva1366 dp

    这题说的是给了 一个矩阵在每个单元内有BLOHHLUM 种的资源 Bi,j, 有YEYENUM 种的 资源Ai,j , 资 源 从 该 单 位 出 发 不能 转 弯 直 接 运 送 到 像 B 类 资 ...

  10. 虚拟化 - VMware

    和VirtualBox一样,也需要关掉Hyper-V才能启动虚拟机,否则会报Guard的错误. 网络 [转]VMware网络连接模式-桥接.NAT以及仅主机模式的详细介绍和区别 桥接 就好像在局域网中 ...