WordPad 2.0

上一期实现了一虽然建议但是功能比较全面的Wordpad程序,但是程序代码略显繁琐,这一期更新改进版。

MainWindows.xaml

添加 <Window.CommandBindings>节点,响应保存和关闭命令

<Window.CommandBindings>
<CommandBinding Command="Close" Executed="CloseCommand" />
<CommandBinding Command="Save" Executed="SaveCommand" CanExecute="SaveCanExecute" />
</Window.CommandBindings>

Menu

 <MenuItem Header="File">
<MenuItem Header="Copy" Command="Copy" />
<MenuItem Header="Paste" Command="Paste" />
<MenuItem Header="Cut" Command="Cut" />
<Separator></Separator>
<MenuItem Header="Save" Command="Save" />
<MenuItem Header="Close" Command="Close" />
</MenuItem>

Tool

<ToolBar Grid.Row="">
<Button Command="Copy">
<Image Source="/Images/Copy16x16.png" />
</Button>
<Button Command="Paste">
<Image Source="/Images/Paste16x16.png" />
</Button>
<Button Command="Cut">
<Image Source="/Images/Cut16x16.png" />
</Button>
<Button Command="Save">
<Image Source="/Images/Save16x16.png" />
</Button>
<Button Command="Close">
<Image Source="/Images/Close16x16.png" />
</Button>
</ToolBar>

TextBox

 <TextBox Grid.Row="" AcceptsReturn="True" TextChanged="TextBox_TextChanged" />

MainWindow.xmal.cs

public partial class MainWindow : Window
{
private bool isDirty = false; public MainWindow()
{
InitializeComponent();
} private void CloseCommand(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("CloseCommand triggered with " + e.Source);
App.Current.Shutdown();
} private void SaveCommand(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("SaveCommand triggered with " + e.Source);
isDirty = false;
} private void SaveCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = isDirty;
} private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
isDirty = true;
}
}

邮件菜单,快捷键,状态控制等功能已经全部实现

解析

所有功能都是通过Command来驱动的

用到的Command

ApplicationCommands.Save

ApplicationCommands.Paste

ApplicationCommands.Cut

ApplicationCommands.Save

ApplicationCommands.Close

TextBox直接支持前三种命令(WordPad1.0中原版使用的是TextBlock,不支持这三种命令,小编手滑,勿用了TextBox)

保存和关闭命令需要有响应的命令处理函数,首先设置Menu和ToolBar的Command属性,通过Command Binding关联Command和处理函数

执行Command时,会触发Execute事件。触发CanExecute事件时,事件处理函数需要返回CanExecute属性,告知系统是否可用

To be continue...

WPF学习之路(五) 实例:写字板(续)的更多相关文章

  1. 【WPF学习】第五十章 故事板

    正如上一章介绍,WPF动画通过一组动画类(Animation类)表示.使用少数几个熟悉设置相关信息,如开始值.结束值以及持续时间.这显然使得它们非常适合于XAML.不是很清晰的时:如何为特定的事件和属 ...

  2. WPF学习之路(二) XAML(续)

    属性 简单属性 前面用到的Width/Height都是简单属性,其赋值一定要放到双引号里 XAML解析器会根据属性的类型执行隐式转换 与C#的区别 SolidBrush.Color = Colors. ...

  3. 【WPF学习】第五十七章 使用代码创建故事板

    在“[WPF学习]第五十章 故事板”中讨论了如何使用代码创建简单动画,以及如何使用XAML标记构建更复杂的故事板——具有多个动画以及播放控制功能.但有时采用更复杂的故事板例程,并在代码中实现全部复杂功 ...

  4. WPF学习之路初识

    WPF学习之路初识   WPF 介绍 .NET Framework 4 .NET Framework 3.5 .NET Framework 3.0 Windows Presentation Found ...

  5. 【WPF学习】第五十四章 关键帧动画

    到目前为止,看到的所有动画都使用线性插值从起点到终点.但如果需要创建具有多个分段的动画和不规则移动的动画.例如,可能希望创建一个动画,快速地将一个元素滑入到视图中,然后慢慢地将它移到正确位置.可通过创 ...

  6. WPF学习之路(五) 实例:写字板

    写字板实例一 MainWindow.xaml <Window x:Class="Wordpad01.MainWindow" xmlns="http://schema ...

  7. 【WPF学习】第五十三章 动画类型回顾

    创建动画面临的第一个挑战是为动画选择正确的属性.期望的结果(例如,在窗口中移动元素)与需要使用的属性(在这种情况下是Canvas.Left和Canvas.Top属性)之间的关系并不总是很直观.下面是一 ...

  8. WPF学习之路(十二)控件(Items控件)

     ListBox 提供了一个选项列表,可以固定或者动态绑定 <StackPanel> <GroupBox Margin="> <GroupBox.Header& ...

  9. WPF学习之路(四)路由

    路由事件概述 功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件. 实现定义:路由事件是一个 CLR 事件,可以由RouteEvent 类的实例提供 ...

随机推荐

  1. EF CodeFirs 代码迁移、数据迁移

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    标题叫EF CodeFirs 代码迁移.数据迁移. ...

  2. java for 的用法总结

    J2SE 1.5提供了另一种形式的for循环.借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等类型的对象.本文介绍使用这种循环的具体方式,说明如何自行定义能被这样遍历的类 ...

  3. ROW_NUMBER、RANK()、DENSE_RANK()和OVER的使用

    /*以FoodPrice列排序并显示排序后的行号*/ SELECT ROW_NUMBER() OVER(ORDER BY FoodPrice DESC) AS RowId,* FROM dbo.Foo ...

  4. java servlet+oracle 新手可看

    最近公司领导告诉接下去接的一个产品,可能会涉及到oracle数据库,以前用得最多的是mssql,前些时间学了下mysql也算少许用过.oracle没接触过.应为我之前做过.net开发,所以数据访问接口 ...

  5. HDU 5792---2016暑假多校联合---World is Exploding

    2016暑假多校联合---World is Exploding Problem Description Given a sequence A with length n,count how many ...

  6. 项目总结笔记系列 Maven Session1

    主题:Maven 参考地址: 1.http://www.yiibai.com/maven/ 2.http://www.icoolxue.com/ 目录 1.环境搭建 2.pom.xml文件解析 3.m ...

  7. 关于JAVA数据储存

    关于JAVA数据储存: 在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register) 这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限,所以 ...

  8. js中的原型、继承的一些想法

    最近看到一个别人写的js类库,突然对js中的原型及继承产生了一些想法,之前也看过其中的一些内容,但是总不是很清晰,这几天利用空闲时间,对这块理解了一下,感觉还是有不通之处,思路上没那么条理,仅作为分享 ...

  9. mysql memory表性能测试以及使用场景

    最近公司计划将风控逻辑移到slave库进行计算,因为考虑到业务表数据会比较大,此时如果还是走nest-loop的话,即使unique进行连接,因为还是需要至少2次以上LIO才能读一条记录,如果达到类似 ...

  10. p7-p8面试经验总结--拿到offer

    简单的介绍下p7-p8之间的面试经验 整体的过程基本上所有的面试都是类似的,分为如下: 1.自我介绍: 2.相关问题讨论和交流: 3.谈薪资: 0.去面试的是架构师,最后来了两个面试官.最后拿到off ...