原文:《Programming WPF》翻译 第5章 5.数据模板和样式

让我们想象一下我们想要实现TTT更有娱乐性的一个版本(这是大部分游戏中最重要的特色)。例如,TTT的一种变体允许玩家每次只能占据3个格子,去除第一步在下第四步的时候,去除第二步在下第五步的时候,,以此类推。为了实现这个变体,我们需要保持对每一步按顺序跟踪——可以利用PlayMover类,如示例5-20。

示例5-20

namespace TicTacToe {

  public class PlayerMove {

    private string playerName;

    public string PlayerName {

      get { return playerName; }

      set { playerName = value; }

    }



    private int moveNumber;

    public int MoveNumber {

      get { return moveNumber; }

      set { moveNumber = value; }

    }



    public PlayerMove(string playerName, int moveNumber) {

      this.playerName = playerName;

      this.moveNumber = moveNumber;

    }

  }

}

现在,取代以为每个按钮对象的内容使用一个简单的字符串,我们将用示例5-20中的一个PlayMover实例鲜明显示这样的一个改动。

示例5-21

namespace TicTacToe {

  public partial class Window1 : Window {

    

    int moveNumber;



    void NewGame( ) {

      

      ;

    }



    void cell_Click(object sender, RoutedEventArgs e) {

      

      // Set button content

      //button.Content = this.CurrentPlayer;

      button.Content =

        new PlayerMove(this.CurrentPlayer, ++this.moveNumber);

      

    }

    

  }

}

图5-6

正如你回想到的,在第四章,图5-6所发生的是,按钮没有足够多的信息生成一个PlayMover对象,但是我们可以通过一个数据模板修复它。

5.5.1数据模板

回忆第四章,WPF允许你定义一个数据模板,这是一棵元素树,可以在特定的上下文中扩展。数据模板用于提供一个应用程序生成非可视化外观对象的能力,正如示例5-22所示。

示例5-22

<?Mapping XmlNamespace="l" ClrNamespace="TicTacToe" ?>

<Window  xmlns:local="local">

  <Window.Resources>

    <DataTemplate DataType="{x:Type local:PlayerMove}">

      <Grid>

        <TextBlock

          TextContent="{Binding Path=PlayerName}"

          FontSize ="32"

          FontWeight="Bold"

          VerticalAlignment="Center"

          HorizontalAlignment="Center" />

        <TextBlock

          TextContent="{Binding Path=MoveNumber}"

          FontSize="16"

          FontStyle="Italic"

          VerticalAlignment="Bottom"

          HorizontalAlignment="Right" />

      </Grid>

    </DataTemplate>

    

  </Window.Resources>

  

</Window>

使用在第一章介绍的xaml映射语法,我们将PlayMover类型间接映射到了带有xmlns属性的xaml中,我们将其作为数据模板的数据类型。现在,无论何时WPF遇到一个PlayMove对象,如我们所有的按钮内容,数据模板都会展开。在我们这种情形,这个模板由一个grid组成,其中排列了两个TextBlock,一个在按钮中间显示玩家名,另一个在按钮右下位置显示移动的步数,伴随着其它的一些设置使之看起来更漂亮。

5.5.2带样式的数据绑定

尽管如此,这些属性设置深埋在数据模板的很深层。正像这是一个好的想法将“魔力数字”移出你的代码,将它们拉出去并给它们一个易于管理的名称,这是一个好的想法将成组的设置移动到样式中,如示例5-23所示。

*将成组的设置移动到样式中,还顾及皮肤和主题,在第六章会介绍。

示例5-23

<Window.Resources>

  <Style x:Key="CellTextStyle" TargetType="{x:Type TextBlock}">

    <Setter Property="FontSize" Value="32" />

    <Setter Property="FontWeight" Value="Bold" />

    <Setter Property="VerticalAlignment" Value="Center" />

    <Setter Property="HorizontalAlignment" Value="Center" />

  </Style>

  <Style x:Key="MoveNumberStyle" TargetType="{x:Type TextBlock}">

    <Setter Property="FontSize" Value="16" />

    <Setter Property="FontStyle" Value="Italic" />

    <Setter Property="VerticalAlignment" Value="Bottom" />

    <Setter Property="HorizontalAlignment" Value="Right" />

  </Style>

  <DataTemplate DataType="{x:Type l:PlayerMove}">

    <Grid>

      <TextBlock

        TextContent="{Binding Path=PlayerName}"

        Style="{StaticResource CellTextStyle}" />

      <TextBlock

        TextContent="{Binding Path=MoveNumber}"

        Style="{StaticResource MoveNumberStyle}" />

    </Grid>

  </DataTemplate>

</Window.Resources>

使用样式是很通常的,从而可以使用数据模板设置成组的属性,创建带有大量属性的大量元素。图5-7显示了这个结果。

图5-7





仍然,像图5-7一样漂亮,交互作用是一种WPF给予的令人厌烦的能力。让我们看一下使用在应用程序中使用样式属性我们都能做些什么。

《Programming WPF》翻译 第5章 5.数据模板和样式的更多相关文章

  1. WPF应用的一些小总结(模板、样式,上下文)

    1: 后台:XXX.DataContext = ViewModel(数据对象)(XXX可以是当前的UserControl.Windows.Grid.TextBlock.Lable等UI控件,选择不同的 ...

  2. 《Programming WPF》翻译 第5章 6.触发器

    原文:<Programming WPF>翻译 第5章 6.触发器 目前为止,我们已经看到样式,作为一个Setter元素的集合.当应用一个样式时,在Setter元素中描述的设置不会无条件地应 ...

  3. 《Programming WPF》翻译 目录

    原文:<Programming WPF>翻译 目录 注:第1.2章我只做了笔记,没有翻译,请大家阅读时注意. 还有就是,这本书的英文版本下载:[O'Reilly] Programming ...

  4. Hadoop专业解决方案-第1章 大数据和Hadoop生态圈

    一.前言: 非常感谢Hadoop专业解决方案群:313702010,兄弟们的大力支持,在此说一声辛苦了,经过两周的努力,已经有啦初步的成果,目前第1章 大数据和Hadoop生态圈小组已经翻译完成,在此 ...

  5. 《Programming WPF》翻译 第9章 3.自定义功能

    原文:<Programming WPF>翻译 第9章 3.自定义功能 一旦你挑选好一个基类,你将要为你的控件设计一个API.大部分WPF元素提供属性暴露了多数功能,事件,命令,因为他们从框 ...

  6. 《Programming WPF》翻译 第9章 2.选择一个基类

    原文:<Programming WPF>翻译 第9章 2.选择一个基类 WPF提供了很多类,当创建一个自定义元素时,你可以从这些类中派生.图9-1显示了一组可能作为类--可能是合适的基类, ...

  7. 《Programming WPF》翻译 第7章 5.可视化层编程

    原文:<Programming WPF>翻译 第7章 5.可视化层编程 形状元素能提供一种便利的方式与图形一起工作,在一些情形中,添加表示绘图的元素到UI树中,可能是比它的价值更加麻烦.你 ...

  8. 《Programming WPF》翻译 第7章 1.图形基础

    原文:<Programming WPF>翻译 第7章 1.图形基础 WPF使得在你的应用程序中使用图形很容易,以及更容易开发你的显卡的能力.这有很多图形构架的方面来达到这个目标.其中最重要 ...

  9. 《Programming WPF》翻译 第7章 2.图形

    原文:<Programming WPF>翻译 第7章 2.图形 图形时绘图的基础,代表用户界面树的元素.WPF支持多种不同的形状,并为它们每一个都提供了元素类型. 7.2.1基本图形类 在 ...

随机推荐

  1. openwrt l7过滤qos配置

    openwrt l7过滤qos配置     电梯直达 1# 本帖最后由 木鸟 于 2010-7-27 10:22 编辑 openwrt的qos基于hsfc.提供了分类标记,流量控制等功能,可能还有整形 ...

  2. How to run Tomcat without root privileges? 常规用户使用tomcat的80端口

    How to run Tomcat without root privileges? 1. The best way is to use jsvc, available as part of the  ...

  3. 【剑指offer】面试题44:扑克牌的顺子

    题目: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定 ...

  4. hdu 1874 畅通工程续(最短路)

    最短路问题! 最简单的最短路问题! 恩! #include<stdio.h> #define MAX 1000000 int map[500][500]; int n,m,start,en ...

  5. 盘点20款表现出众的HTML5游戏

    不管是对用户还是开发者来说,HTML5和JavaScript游戏这几年的发展真的是件好事.随着浏览器平台的日趋成熟,并开始整合这类型游戏所 要求的技术,我们每天都能在各大应用商店和社交网站中看到越来越 ...

  6. JMeter分布式性能测试

    利用JMeter进行负载测试的时候,使用单台机器模拟测试超过1000个行程的并发就有些力不从心,在执行的过程中,JMeter自身会自动关闭,要解决这个问题,可以使用分布式测试,运行多台机器运行所谓的  ...

  7. Oracle11g环境设置-windows环境

    新建环境变量(系统变量),变量名:ORACLE_HOME 变量值:E:\app\Administrator\product\11.2.0\dbhome_1 新建环境变量(系统变量),变量名:ORACL ...

  8. JQuery.ajax一解

    关于JQuery.ajax方法,好处也不用多说了,主要是想记下ajax中的一些参数: url:请求的目标地址,为一个字符串,格式为:http://localhost:端口号/User/方法名.eg:现 ...

  9. OC基础 可变数组与不可变数组的使用

    OC基础 可变数组与不可变数组的使用 1.不可变数组 1.1不可变数组的创建 //实例方法 NSArray *array = [[NSArray alloc] initWithObjects:&quo ...

  10. 你真的了解:IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数 吗?

    原文链接:http://www.cnblogs.com/yinhaichao/p/4060209.html?utm_source=tuicool&utm_medium=referral 一般购 ...