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="1">
            <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="2" 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...

时间: 2024-09-29 00:31:38

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

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

属性 简单属性 前面用到的Width/Height都是简单属性,其赋值一定要放到双引号里 XAML解析器会根据属性的类型执行隐式转换 与C#的区别 SolidBrush.Color = Colors.AliceBlue; <Button Color = "AliceBlue" /> C#中有的枚举类型可以用(|)运算符组合,在XAML中用(,)分隔 附加属性 附加属性可以用于多个控件,但是在另外一个类中定义的属性,在WPF中常常用于布局 如DockPanel.Dock=&q

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

写字板实例一 MainWindow.xaml <Window x:Class="Wordpad01.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WordPad1.0" Height=&qu

【WPF学习】第五十五章 基于路径的动画

基于路径的动画使用PathGeometry对象设置属性.尽管原则上基于路径的动画也能用于修改任何适当数据类型的属性,但当动态改变与位置相关的属性时最有用.实际上,基于路径的动画类主要用于帮助沿着一条路径移动可视化对象. 正如在“[WPF学习]第四十三章 路径和几何图形”学过的,PathGeometry对象描述可包含直线.弧线以及曲线的图形.下图显示的示例具有一个PathGeometry对象,该对象包含两条弧线以及一条将最后定义的点连接到起点的直线段.这样就创建了一条闭合的路线,一个小的矢量图像以

WPF学习之路(四)路由

路由事件概述 功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件. 实现定义:路由事件是一个 CLR 事件,可以由RouteEvent 类的实例提供支持并由 Windows Presentation Foundation (WPF) 事件系统来处理. 实例: Xaml <Border Height="50" Width="300" BorderBrush="Gray" BorderThic

LTE学习之路(12)——PDCCH(续)

12.1 前言 PDCCH提供的主要功能之一就是传输物理层资源分配指示,并且在每个子帧上,PDCCH指示频域资源分配. 频域资源(一组资源块)分配信令设计的主要挑战是在灵活性和信令开销之间找到一个好的这种方案.一个可行的方法是发送组合的资源分配消息给所有UE,但有可能被拒绝,这是因为可靠到达所有的UE需要很高的功率,包括小区边缘的UE. LTE资源分配有3中类型:type0.type1和type2,具体使用哪种资源分配类型取决于所选的DCI format以及DCI内相关bit的配置.(有关DCI

WPF学习之路(十)实例:用户注册

通过一个注册用户的实例了解页面间数据的传递 首先构建一个User类  User.cs public class User { private string name; public string Name { get { return this.name; } set { this.name = value; } } private string password; public string Password { get { return this.password; } set { this

【WPF学习】第五十二章 动画性能

通常,为用户界面应用动画只不过是创建并配置正确的动画和故事板对象.但在其他情况下,特别是同时发生多个动画时,可能需要更加关注性能.特定的效果更可能导致这些问题——例如,那些涉及视频.大位图以及多层透明等的效果通常需要占用更多CPU开销.如果不谨慎实现这类效果,运行它们使可能造成明显抖动,或者会从其他同时运行的应用程序抢占CPU时间. 幸运的是,WPF提供了几个可提供帮助的技巧.接下来的几节将学习降低最大帧率以及缓存计算机显卡中的位图,这两种技术可以减轻CPU的负担. 一.期望的帧率 正如前面所学

WPF学习之路(一) 初识WPF

参考<葵花宝典-WPF自学手册> VS2012 先创建第一个WPF小程序 1.创建WPF程序 2.查看Solution,WPF中xaml文件和cs文件经常成对出现 两个主要的类:APP(WPF主程序) MainWindow(程序主窗口) 3.添加Button和Click事件 MainWindow.xaml <Grid> <Button Content="Hello WPF" Margin="5" Click="Button_C

WPF学习之路(三) 属性与依赖

类型是DependencyProperty的属性是依赖属性 依赖属性不同于普通的.Net属性,类似于一个计算过程,根据依赖的值得到最终值. 为什么引入依赖属性: MSDN原文 One of the primary architectural philosophies used in building WPF was a preference for properties over methods or events. WPF的设计思想是侧重属性胜于方法和事件. 实例 依赖属性对资源引用的支持 设