WPF学习之路(五) 实例:写字板(续)
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学习之路(五) 实例:写字板(续)的更多相关文章
- 【WPF学习】第五十章 故事板
正如上一章介绍,WPF动画通过一组动画类(Animation类)表示.使用少数几个熟悉设置相关信息,如开始值.结束值以及持续时间.这显然使得它们非常适合于XAML.不是很清晰的时:如何为特定的事件和属 ...
- WPF学习之路(二) XAML(续)
属性 简单属性 前面用到的Width/Height都是简单属性,其赋值一定要放到双引号里 XAML解析器会根据属性的类型执行隐式转换 与C#的区别 SolidBrush.Color = Colors. ...
- 【WPF学习】第五十七章 使用代码创建故事板
在“[WPF学习]第五十章 故事板”中讨论了如何使用代码创建简单动画,以及如何使用XAML标记构建更复杂的故事板——具有多个动画以及播放控制功能.但有时采用更复杂的故事板例程,并在代码中实现全部复杂功 ...
- WPF学习之路初识
WPF学习之路初识 WPF 介绍 .NET Framework 4 .NET Framework 3.5 .NET Framework 3.0 Windows Presentation Found ...
- 【WPF学习】第五十四章 关键帧动画
到目前为止,看到的所有动画都使用线性插值从起点到终点.但如果需要创建具有多个分段的动画和不规则移动的动画.例如,可能希望创建一个动画,快速地将一个元素滑入到视图中,然后慢慢地将它移到正确位置.可通过创 ...
- WPF学习之路(五) 实例:写字板
写字板实例一 MainWindow.xaml <Window x:Class="Wordpad01.MainWindow" xmlns="http://schema ...
- 【WPF学习】第五十三章 动画类型回顾
创建动画面临的第一个挑战是为动画选择正确的属性.期望的结果(例如,在窗口中移动元素)与需要使用的属性(在这种情况下是Canvas.Left和Canvas.Top属性)之间的关系并不总是很直观.下面是一 ...
- WPF学习之路(十二)控件(Items控件)
ListBox 提供了一个选项列表,可以固定或者动态绑定 <StackPanel> <GroupBox Margin="> <GroupBox.Header& ...
- WPF学习之路(四)路由
路由事件概述 功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件. 实现定义:路由事件是一个 CLR 事件,可以由RouteEvent 类的实例提供 ...
随机推荐
- EF CodeFirs 代码迁移、数据迁移
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 标题叫EF CodeFirs 代码迁移.数据迁移. ...
- java for 的用法总结
J2SE 1.5提供了另一种形式的for循环.借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等类型的对象.本文介绍使用这种循环的具体方式,说明如何自行定义能被这样遍历的类 ...
- ROW_NUMBER、RANK()、DENSE_RANK()和OVER的使用
/*以FoodPrice列排序并显示排序后的行号*/ SELECT ROW_NUMBER() OVER(ORDER BY FoodPrice DESC) AS RowId,* FROM dbo.Foo ...
- java servlet+oracle 新手可看
最近公司领导告诉接下去接的一个产品,可能会涉及到oracle数据库,以前用得最多的是mssql,前些时间学了下mysql也算少许用过.oracle没接触过.应为我之前做过.net开发,所以数据访问接口 ...
- HDU 5792---2016暑假多校联合---World is Exploding
2016暑假多校联合---World is Exploding Problem Description Given a sequence A with length n,count how many ...
- 项目总结笔记系列 Maven Session1
主题:Maven 参考地址: 1.http://www.yiibai.com/maven/ 2.http://www.icoolxue.com/ 目录 1.环境搭建 2.pom.xml文件解析 3.m ...
- 关于JAVA数据储存
关于JAVA数据储存: 在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register) 这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限,所以 ...
- js中的原型、继承的一些想法
最近看到一个别人写的js类库,突然对js中的原型及继承产生了一些想法,之前也看过其中的一些内容,但是总不是很清晰,这几天利用空闲时间,对这块理解了一下,感觉还是有不通之处,思路上没那么条理,仅作为分享 ...
- mysql memory表性能测试以及使用场景
最近公司计划将风控逻辑移到slave库进行计算,因为考虑到业务表数据会比较大,此时如果还是走nest-loop的话,即使unique进行连接,因为还是需要至少2次以上LIO才能读一条记录,如果达到类似 ...
- p7-p8面试经验总结--拿到offer
简单的介绍下p7-p8之间的面试经验 整体的过程基本上所有的面试都是类似的,分为如下: 1.自我介绍: 2.相关问题讨论和交流: 3.谈薪资: 0.去面试的是架构师,最后来了两个面试官.最后拿到off ...