微软公司在Visual Studio 2015产品套件中作出了许多革命性的变更,包括.NET开源,.NET服务器端部分跨平台,推出向个人和小团队免费的社区版,移动应用开发部分跨平台支持,商店应用支持C#编译成本地代码等。

另一个很重大的改进就是Blend使用Visual Studio框架重新制作,以使得XAML和C#代码的编辑能力达到了Visual Studio的水平。由于对XAML的解析使用独立的进程进行,稳定性得到了极大的提高。下文就对这个重新制作的Blend进行一些初步研究。

首先通过菜单 文件-新建-项目 打开如下对话框,创建一个新的WPF项目。

这时发现用户界面已经改为Visual Studio的模式,解决方案资源管理器和团队资源管理器面板和Visual Studio的一模一样,也就意味着对项目文件和类库的管理能力和对源代码管理的支持能力达到了VS的程度,这点是非常值得让人高兴的。界面菜单项的安排,错误列表面板,输出面板,查找结果面板也都和VS一样,查找和替换功能的使用也和VS一致。

原来的属性编辑功能使用属性面板实现,原来的对象浏览器功能使用增强版的文档大纲面板实现。资产面板,状态面板,触发器面板,数据面板和资源面板和原有版本保持一致。

原有的美工板部分现在使用VS框架中核心的文档编辑功能实现,打开一个XAML文件,使用和VS相似的界面展现,左侧增加了Blend的工具栏,如下图。

可视化编辑能力达到了原有Blend的水平,代码编写能力又达到了VS的水平,可谓是VS和Blend的完美结合。C#的开发也和VS保持一致,包括智能感知,查找引用等特性的支持,但目前不支持Resharper(Visual Studio 2015可以支持Resharper9)。以后做View层开发的人员可以只用Blend一个工具了,不用像以前一样同时开VS和Blend了,还得进行代码同步。

下面通过一个简单的小例子尝试通过可视化开发的方法完成添加控件,修改布局,样式抽取,创建样例数据,数据模板编辑,数据绑定等工作,以对新Blend的使用进行探究。

1. 首先在美工板中移动鼠标,看到出现如下图黄色的线单击,使Grid添加一行。

再把鼠标移到如下图位置,美工板中出现39*图示,点击星号,可在各种模式之间切换,先暂时改为39锁。

目前代码如下

  1. <Window x:Class="BlendDemo.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:local="clr-namespace:BlendDemo"
  7. mc:Ignorable="d"
  8. Title="MainWindow" Height="350" Width="525">
  9. <Grid>
  10. <Grid.RowDefinitions>
  11. <RowDefinition Height="39"/>
  12. <RowDefinition/>
  13. </Grid.RowDefinitions>
  14.  
  15. </Grid>
  16. </Window>

2. 按快捷键T或在左侧工具栏中选择TextBlock工具,在Grid的第一行中绘制一个文本块,按Escape键取消编辑状态,按Ctrl+Shift+R组合键,或通过菜单 格式-布局-重置全部命令,重置全部布局参数。在选中文本块控件的条件下,在属性面板中点击Text属性右侧的黑色方块,选中重置,以重置该属性。点击文本组属性下方的下拉按钮展开更多属性,用同样的方法把TextWrapping属性也重置为默认值。

下面说明一下小方块的各种颜色的含义,

黑色表示本地值,即通过XAML标签属性直接设置的值。

绿色表示引用资源,静态或动态的资源。

黄色表示绑定,普通绑定或模板绑定。

紫色表示继承的值。

蓝色表示通过样式获取的值。

应该记住这些颜色的含义,以便观察属性面板时一目了然。

在Text属性中输入“人员列表”,修改文本组中的字体和字号为SimHei和22px,如果字号的单位是pt,可以在菜单 工具-选项-XAML设计器-类型单位 中改为像素,以和XAML代码中保持一致。设置Margin为10,10,10,10。

按前述所示把Grid的第一行改为Auto(点击锁变为Auto)。

此时代码如下

  1. <Window x:Class="BlendDemo.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:local="clr-namespace:BlendDemo"
  7. mc:Ignorable="d"
  8. Title="MainWindow" Height="350" Width="525">
  9. <Grid>
  10. <Grid.RowDefinitions>
  11. <RowDefinition Height="Auto"/>
  12. <RowDefinition/>
  13. </Grid.RowDefinitions>
  14. <TextBlock FontFamily="SimHei" Text="人员列表" FontSize="22" Margin="10"/>
  15.  
  16. </Grid>
  17. </Window>

3. 在文档大纲面板中选择TextBlock控件后,右键点击,在弹出的菜单中选择 编辑样式-创建空样式,在弹出的窗口中点击确定按钮,以创建样式。

可以看到此时美工板顶部的导航栏中出现了一个调色板一样的图示,表示现在正在编辑样式。

此时在属性面板中,在文本组中,点击字体和字号右侧的小方块,选择转换为本地值,可以看到这时字体和字号就被抽取到样式里了,代码如下。

  1. <Window x:Class="BlendDemo.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:local="clr-namespace:BlendDemo"
  7. mc:Ignorable="d"
  8. Title="MainWindow" Height="350" Width="525">
  9. <Window.Resources>
  10. <Style x:Key="TextBlockStyle1" TargetType="{x:Type TextBlock}">
  11. <Setter Property="FontFamily" Value="SimHei"/>
  12. <Setter Property="FontSize" Value="22"/>
  13. </Style>
  14. </Window.Resources>
  15. <Grid>
  16. <Grid.RowDefinitions>
  17. <RowDefinition Height="Auto"/>
  18. <RowDefinition/>
  19. </Grid.RowDefinitions>
  20. <TextBlock Text="人员列表" Margin="10" Style="{DynamicResource TextBlockStyle1}"/>
  21.  
  22. </Grid>
  23. </Window>

4. 点击文档大纲面板顶部的返回上一级按钮(横线加向上箭头),退出样式编辑模式。在资产面板中选择ListBox控件,在美工板中的Grid的第二行的位置上拖动出一个ListBox控件,按Ctrl+Shift+R重置布局。

5. 在数据面板中添加样例数据。首先选择项目或此文档,此处选择项目,这样可以做到多个文件共享数据。点击面板右上方的创建示例数据按钮,选择新建示例数据,在弹出的对话框中输入数据源名称,勾选在应用程序运行时启用示例数据选项,点击确定。

把Collection,Property1和Property2改为Persons,Name和Sex,可以尝试加入其他类型的属性,包括简单属性和集合属性等。

6. 点击数据面板下方的设置设计时数据上下文按钮,弹出如下对话框。

选择DesignData,点击确定按钮。

可以看到代码中加入了d:DataContext。

  1. <Window x:Class="BlendDemo.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:local="clr-namespace:BlendDemo"
  7. mc:Ignorable="d"
  8. Title="MainWindow" Height="350" Width="525" d:DataContext="{d:DesignData /SampleData/SampleDataSource/SampleDataSource.xaml}">

也就是说设计时数据并没有占用正常的DataContext属性,以后ViewModel层开发人员可以正常使用。

7. 在美工板或文档大纲面板中选中ListBox控件,在属性面板中点击ItemsSource属性右侧的小方块,在弹出的菜单中选择创建数据绑定。在弹出的对话框中选择Persons,点击确定按钮。

8. 在美工板或文档大纲面板中选中ListBox控件,在美工板顶部导航栏中,点击ListBox,在弹出的菜单中选择 编辑其他模板-编辑生成的项-创建空白项,输入名称,点击确定。此时进入ItemTemplate编辑模式,美工板导航栏如下图。

点击美工板左侧栏中的Grid按钮,在美工板中绘制一个Grid布局,使用前文所述的方法把Grid分成两列,在第一列中绘制一个文本块,第二列中绘制一个CheckBox,使用快捷键重置文本块和CheckBox的布局(Ctrl+Shift+R)。把Grid的第一列改为*,第二列改为Auto,并清除Width和Height(在文档大纲面板中选择Grid布局,在属性面板中,点击Width和Height的小方块,选择重置)。这时文本块和CheckBox并没有拉伸开,如下图。

点击美工板导航栏中的ListBox按钮,在属性面板中把HorizontalContentAlignment改为Stretch,这样就变成了如下图所示。

9. 点击美工板导航栏中的Grid按钮,重新进入ItemTemplate编辑状态。选择TextBlock控件,在属性面板中点击Text属性的小方块,选择创建数据绑定,在弹出的对话框中选择Name属性,点击确定,如下图。

选择CheckBox控件,在属性面板中把Content改为男。点击IsChecked属性的小方块,选择创建数据绑定,在弹出的对话框中选择Sex属性,点击确定。

至此View层的基本开发工作已经初步完成了,最终效果如下图。

设计时视图已经显示了设计效果,而运行程序ListBox中并不显示任何内容,示例数据不影响正常业务逻辑,View和ViewModel层独立开发(可能分为前端和后端开发人员),绑定属性名和类型是两者的接口,这正是我们要的效果。

如果查看数据面板为示例数据生成的代码,如SampleDataSource.xaml.cs,可以发现有条件编译语句存在,如

#if DISABLE_SAMPLE_DATA

            internal class SampleDataSource { }

#else

正如注释所说“若要在生产(环境)应用程序中显著减小示例数据涉及面,则可以设置DISABLE_SAMPLE_DATA 条件编译常量并在运行时禁用示例数据”。

最终的代码如下,

  1. <Window x:Class="BlendDemo.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:local="clr-namespace:BlendDemo"
  7. mc:Ignorable="d"
  8. Title="MainWindow" Height="350" Width="525" d:DataContext="{d:DesignData /SampleData/SampleDataSource/SampleDataSource.xaml}">
  9. <Window.Resources>
  10. <Style x:Key="TextBlockStyle1" TargetType="{x:Type TextBlock}">
  11. <Setter Property="FontFamily" Value="SimHei"/>
  12. <Setter Property="FontSize" Value="22"/>
  13. </Style>
  14. <DataTemplate x:Key="DataTemplate1">
  15. <Grid>
  16. <Grid.ColumnDefinitions>
  17. <ColumnDefinition Width="*"/>
  18. <ColumnDefinition Width="Auto"/>
  19. </Grid.ColumnDefinitions>
  20. <TextBlock Height="Auto" TextWrapping="Wrap" Text="{Binding Name}" Width="Auto"/>
  21. <CheckBox Content="男" Grid.Column="1" Height="Auto" Width="Auto" IsChecked="{Binding Sex}"/>
  22. </Grid>
  23. </DataTemplate>
  24. </Window.Resources>
  25. <Grid>
  26. <Grid.RowDefinitions>
  27. <RowDefinition Height="Auto"/>
  28. <RowDefinition/>
  29. </Grid.RowDefinitions>
  30. <TextBlock Text ="人员列表" Margin="10" Style ="{DynamicResource TextBlockStyle1}"/>
  31. <ListBox Grid.Row ="1" ItemsSource="{Binding Persons}" ItemTemplate="{DynamicResource DataTemplate1}" HorizontalContentAlignment="Stretch"/>
  32.  
  33. </Grid>
  34. </Window>

我们没有直接编写任何代码,全部可视化开发,由Blend生成代码。

下一篇讲述细节样式修改,敬请关注。

Blend 2015 教程 (一) 基础的更多相关文章

  1. Blend 2015 教程 (四)控件模板

    前一篇讲述了修改ListBox样式的方法,本篇将修改性别显示区域的样式. 1. 选择ListBox控件,编辑ItemTemplate的当前项,选择CheckBox控件,在美工板导航栏中点击CheckB ...

  2. Blend 2015 教程 (二) 样式

    前一篇讲述了如何在新Blend中完成一个简单的带数据绑定的界面小例子,本篇将讲述一下,把View层和Style层分开,并搭建Style层框架的方法,并进行细节样式修改. 1. 在解决方案资源管理器面板 ...

  3. Blend 2015 教程 (三) 模板

    前一篇讲述了一些基本样式的修改方法,并搭建了Style层的基本框架,本篇将进一步修改ListBox的样式. 1. 首先选中ListBox控件,在美工板导航栏中点击ListBox,选择 编辑其他模板-编 ...

  4. Blend 2015 教程 (五) 自定义状态

    本篇再补充一块内容,就是自定义状态的介绍. 自定义状态用于封装用户控件在各种状态之间切换时的外观变化及其动画效果,方便调用.比如有个用户控件用于实现类似舞台幕布打开和关闭切换的效果,可以创建幕布关闭和 ...

  5. VB6 GDI+ 入门教程[5] 基础绘图小结

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[5] 基础绘图小结 2009 年 6 月 18 日 4条 ...

  6. Nmap扫描教程之基础扫描详解

    Nmap扫描教程之基础扫描详解 Nmap扫描基础扫描 当用户对Nmap工具了解后,即可使用该工具实施扫描.通过上一章的介绍,用户可知Nmap工具可以分别对主机.端口.版本.操作系统等实施扫描.但是,在 ...

  7. React实例入门教程(1)基础API,JSX语法--hello world

      前  言 毫无疑问,react是目前最最热门的框架(没有之一),了解并学习使用React,可以说是现在每个前端工程师都需要的. 在前端领域,一个框架为何会如此之火爆,无外乎两个原因:性能优秀,开发 ...

  8. iptables详细教程:基础、架构、清空规则、追加规则、应用实例(转)

    iptables防火墙可以用于创建过滤(filter)与NAT规则.所有Linux发行版都能使用iptables,因此理解如何配置iptables将会帮助你更有效地管理Linux防火墙.如果你是第一次 ...

  9. 【原创】React实例入门教程(1)基础API,JSX语法--hello world

    前  言 毫无疑问,react是目前最最热门的框架(没有之一),了解并学习使用React,可以说是现在每个前端工程师都需要的. 在前端领域,一个框架为何会如此之火爆,无外乎两个原因:性能优秀,开发效率 ...

随机推荐

  1. sublimeText3安装emmet(For Mac)

    每次重装st,安装emmet都困难重重,对上一次依照网上查的资料一步步做好了,这次又忘了如何操作,结果又是网上搜索打开一箩筐的网页. 终于决定,把这些惨痛的经历记录下来,要用的话自己看,也可能可以帮助 ...

  2. 1、C语言基本数据类型

    1.分类如图: 2.大小如下 char                        1字节 short                      2字节 int                   ...

  3. Module 'fileinfo' already loaded in Unknown on line 0

    出现的原因是:需要加载的扩展已经以而二进制文件的形式写入了php中,但是,在php.ini中却再一次动态加载 参考出处

  4. About memories in ASIC FPGA

    1. Write first | Read First | No Change区别在于:en & wr的时候,dout是什么,三种case对应于: dout = din; dout = mem ...

  5. linux 查看php-fpm 进程数

    netstat -napo |grep "php-fpm" | wc -l

  6. Test注解的两个属性(转)

    Test注解的两个属性:expected和timeout Junit的Test注解支持两个可选的参数expected和timeout.expected声明一个测试方法必须抛出一个异常.如果不抛出异常或 ...

  7. [05]APUE:标准 I/O 库

    [a] setvbuf / setbuf #include <stdio.h> int setvbuf(FILE *restrict fp, char *restrict buf, int ...

  8. C#之方法的重载与递归

    (1). 方法的重载:方法的名称相同,但参数不同. 1.如果参数的个数相同,那么参数的类型不能相同. 2.如果参数的类型相同,那么参数的个数不能相同. (2).方法的递归:方法自己调用自己.用于找出一 ...

  9. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  10. 【日常小问题】windows系统操作技巧

    如何将文件夹视图设置为“详细信息” @2015.3.30 这段时间刚换了电脑,资源管理器视图模式为“大图标”,很不符合俺的操作习惯.修改之—— 1.打开一个文件夹,设置为详细信息显示. 2.点击工具- ...