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

简介: 原文:《Programming WPF》翻译 第5章 5.数据模板和样式让我们想象一下我们想要实现TTT更有娱乐性的一个版本(这是大部分游戏中最重要的特色)。例如,TTT的一种变体允许玩家每次只能占据3个格子,去除第一步在下第四步的时候,去除第二步在下第五步的时候,,以此类推。
原文: 《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( ) {
      
      
this.moveNumber = 0;
    }


    
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给予的令人厌烦的能力。让我们看一下使用在应用程序中使用样式属性我们都能做些什么。

目录
打赏
0
0
0
0
216
分享
相关文章
硬件交互新体验:WPF与传感器的完美结合——从初始化串行端口到读取温度数据,一步步教你打造实时监控的智能应用
【8月更文挑战第31天】本文通过详细教程,指导Windows Presentation Foundation (WPF) 开发者如何读取并处理温度传感器数据,增强应用程序的功能性和用户体验。首先,通过`.NET Framework`的`Serial Port`类实现与传感器的串行通信;接着,创建WPF界面显示实时数据;最后,提供示例代码说明如何初始化串行端口及读取数据。无论哪种传感器,只要支持串行通信,均可采用类似方法集成到WPF应用中。适合希望掌握硬件交互技术的WPF开发者参考。
128 0
WPF开发者必备秘籍:深度解析数据网格最佳实践,轻松玩转数据展示与编辑大揭秘!
【8月更文挑战第31天】数据网格控件是WPF应用程序中展示和编辑数据的关键组件,提供排序、筛选等功能,显著提升用户体验。本文探讨WPF中数据网格的最佳实践,通过DevExpress DataGrid示例介绍其集成方法,包括添加引用、定义数据模型及XAML配置。通过遵循数据绑定、性能优化、自定义列等最佳实践,可大幅提升数据处理效率和用户体验。
118 0
WPF开发者必读:资源字典应用秘籍,轻松实现样式与模板共享,让你的WPF应用更上一层楼!
【8月更文挑战第31天】在WPF开发中,资源字典是一种强大的工具,用于共享样式、模板、图像等资源,提高了应用的可维护性和可扩展性。本文介绍了资源字典的基础知识、创建方法及最佳实践,并通过示例展示了如何在项目中有效利用资源字典,实现资源的重用和动态绑定。
213 0
WPF开发者必读:样式与模板的艺术,轻松定制UI外观,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用开发中,样式与模板是实现美观界面与一致性的关键工具。样式定义了控件如字体、颜色等属性,而模板则允许自定义控件布局与子控件,两者均可存储于`.xaml`文件中。本文介绍了样式与模板的基础知识,通过示例展示了如何创建并应用它们来改变按钮的外观,从而提升用户体验。
186 0
WPF数据绑定实战:从零开始,带你玩转数据与界面同步,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用开发中,数据绑定是核心技能之一,它能实现界面元素与数据源的同步更新。本文详细介绍了WPF数据绑定的概念与实现方法,包括属性绑定、元素绑定及路径绑定等技术,并通过示例代码展示了如何创建数据绑定。通过数据绑定,开发者不仅能简化代码、提高可维护性,还能提升用户体验。无论初学者还是有经验的开发者,都能从中受益,更好地掌握WPF数据绑定技巧。
155 0
WPF/C#:显示分组数据的两种方式
WPF/C#:显示分组数据的两种方式
91 0
WPF/C#:更改界面的样式
WPF/C#:更改界面的样式
88 0
|
7月前
|
WPF/C#:如何将数据分组显示
WPF/C#:如何将数据分组显示
61 0
基于Material Design风格开源、易用、强大的WPF UI控件库
基于Material Design风格开源、易用、强大的WPF UI控件库
468 0
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件