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="" Width="">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Menu Grid.Row="">
<MenuItem Header="File" />
<MenuItem Header="Copy" />
<MenuItem Header="Paste" />
<MenuItem Header="Cut" />
<MenuItem Header="Delete" />
</Menu>
<ToolBar Grid.Row="">
<Button>
<Image Source="/Images/Copy.png" />
</Button>
<Button>
<Image Source="/Images/Paste.png" />
</Button>
<Button>
<Image Source="/Images/Cut.png" />
</Button>
<Button>
<Image Source="/Images/Delete.png" />
</Button>
</ToolBar>
<TextBox x:Name="text" Grid.Row="" Text="WordPad" FontSize="" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</Window>
主要依靠Clipboard类实现
为Button添加Click时间
<MenuItem Header="Copy" Click="CopyClick" />
<Button Click="CopyClick">
private void CopyClick(object sender, RoutedEventArgs e)
{
if (text.Text != null && text.Text.Length > )
{
Clipboard.SetText(text.Text);
}
} private void PasteClick(object sender, RoutedEventArgs e)
{
if (Clipboard.ContainsText())
{
text.Text = Clipboard.GetText();
}
} private void CutClick(object sender, RoutedEventArgs e)
{
CopyClick(sender, e);
DeleteClick(sender, e);
} private void DeleteClick(object sender, RoutedEventArgs e)
{
text.Text = null;
}
添加右键菜单
<TextBox x:Name="text" Grid.Row="" Text="WordPad" FontSize="" TextWrapping="Wrap" Height="Auto" Width="Auto" Margin="">
<TextBox.ContextMenu>
<ContextMenu>
<MenuItem Header="Copy" Click="CopyClick" />
<MenuItem Header="Paste" Click="PasteClick" />
<MenuItem Header="Cut" Click="CutClick" />
<MenuItem Header="Delete" Click="DeleteClick" />
</ContextMenu>
</TextBox.ContextMenu>
</TextBox>
添加快捷键 KeyGesture
private KeyGesture gestCopy = new KeyGesture(Key.C, ModifierKeys.Control);
private KeyGesture gestPaste = new KeyGesture(Key.V, ModifierKeys.Control);
private KeyGesture gestCut = new KeyGesture(Key.X, ModifierKeys.Control);
private KeyGesture gestDelete= new KeyGesture(Key.Delete); protected override void OnPreviewKeyDown(KeyEventArgs e)
{
base.OnPreviewKeyDown(e);
e.Handled = true;
if (gestCopy.Matches(null, e))
{
CopyClick(this, e);
}
else if (gestPaste.Matches(null, e))
{
PasteClick(this, e);
}
else if (gestCut.Matches(null, e))
{
CutClick(this, e);
}
else if (gestDelete.Matches(null, e))
{
DeleteClick(this, e);
}
}
添加状态控制
菜单栏
<MenuItem Header="File" SubmenuOpened="MenuItem_SubmenuOpened"/>
<MenuItem x:Name="copyItem" Header="Copy" Click="CopyClick" />
<MenuItem x:Name="pasteItem" Header="Paste" Click="PasteClick" />
<MenuItem x:Name="cutItem" Header="Cut" Click="CutClick" />
<MenuItem x:Name="deleteItem" Header="Delete" Click="DeleteClick" />
private void MenuItem_SubmenuOpened(object sender, RoutedEventArgs e)
{
cutItem.IsEnabled = copyItem.IsEnabled = deleteItem.IsEnabled
= text.Text != null && text.Text.Length > ;
pasteItem.IsEnabled = Clipboard.ContainsText();
}
TextBox同理
<TextBox x:Name="text" ContextMenuOpening="text_ContextMenuOpening">
快捷键与工具栏同上
一个简易的写字板程序完成了,但是有没有发现很麻烦呢,下一期更新WordPad2.0版

To be continue...
WPF学习之路(五) 实例:写字板的更多相关文章
- 【WPF学习】第五十章 故事板
正如上一章介绍,WPF动画通过一组动画类(Animation类)表示.使用少数几个熟悉设置相关信息,如开始值.结束值以及持续时间.这显然使得它们非常适合于XAML.不是很清晰的时:如何为特定的事件和属 ...
- 【WPF学习】第五十七章 使用代码创建故事板
在“[WPF学习]第五十章 故事板”中讨论了如何使用代码创建简单动画,以及如何使用XAML标记构建更复杂的故事板——具有多个动画以及播放控制功能.但有时采用更复杂的故事板例程,并在代码中实现全部复杂功 ...
- WPF学习之路初识
WPF学习之路初识 WPF 介绍 .NET Framework 4 .NET Framework 3.5 .NET Framework 3.0 Windows Presentation Found ...
- 【WPF学习】第五十四章 关键帧动画
到目前为止,看到的所有动画都使用线性插值从起点到终点.但如果需要创建具有多个分段的动画和不规则移动的动画.例如,可能希望创建一个动画,快速地将一个元素滑入到视图中,然后慢慢地将它移到正确位置.可通过创 ...
- 【WPF学习】第五十三章 动画类型回顾
创建动画面临的第一个挑战是为动画选择正确的属性.期望的结果(例如,在窗口中移动元素)与需要使用的属性(在这种情况下是Canvas.Left和Canvas.Top属性)之间的关系并不总是很直观.下面是一 ...
- WPF学习之路(十二)控件(Items控件)
ListBox 提供了一个选项列表,可以固定或者动态绑定 <StackPanel> <GroupBox Margin="> <GroupBox.Header& ...
- WPF学习之路(四)路由
路由事件概述 功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件. 实现定义:路由事件是一个 CLR 事件,可以由RouteEvent 类的实例提供 ...
- WPF学习之路(五) 实例:写字板(续)
WordPad 2.0 上一期实现了一虽然建议但是功能比较全面的Wordpad程序,但是程序代码略显繁琐,这一期更新改进版. MainWindows.xaml 添加 <Window.Comman ...
- WPF学习之路(十)实例:用户注册
通过一个注册用户的实例了解页面间数据的传递 首先构建一个User类 User.cs public class User { private string name; public string Na ...
随机推荐
- 新学C#的List<T>总结
所属命名空间:using System.Collections.Generic; List<T>类是 ArrayList 类的泛型等效类. 该类使用大小可按需动态增加的数组实现 IList ...
- MVP的PV模式与SC模式
MVC是现今挺被推崇的一种架构模式,而MVP在MVC的基础对视图与模型上再解耦,使结构和各自的功能也有所改变.在去年鄙人也尝试了一下使用MVP做了一个小Demo,作为了MVC的一个变体,MVP还分了两 ...
- csharp:using OpenXml SDK 2.0 and ClosedXML read excel file
https://openxmlexporttoexcel.codeplex.com/ http://referencesource.microsoft.com/ 引用: using System; u ...
- 孙鑫MFC学习笔记3:MFC程序运行过程
1.MFC中WinMain函数的位置在APPMODUL.cpp APPMODUL.cpp中是_tWinMain,其实_tWinMain是一个宏#define _tWinMain WinMain 2.全 ...
- 2016暑假多校联合---A Simple Chess
2016暑假多校联合---A Simple Chess Problem Description There is a n×m board, a chess want to go to the po ...
- 【FOL】第二周
一直在忙其他事情,停了好久了.终于又可以开始做点东西了. 这周主要工作: 1.整理客户端代码,加入网络模块:fol.client.net. 2.写了个简单的版本服务端程序. 3.初步完成了自动更新功能 ...
- Mysql新增用户,权限管理
MySQL 赋予用户权限命令的简单格式可概括为:grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利. grant selec ...
- Monkey测试3——Monkey测试结果分析
Monkey测试结果分析 一. 初步分析方法: Monkey测试出现错误后,一般的差错步骤为以下几步: 1. 找到是monkey里面的哪个地方出错 2. 查看Monkey里面出错前的一些事件动作,并手 ...
- nginx性能优化之线程池
默认情况下,nginx的work process按照顺序一个个处理http请求,因此如果后台处理时间较长,则work process会长时间等待IO状态,因此限制并发性.如下所示: 所以,对于可能存在 ...
- Webform(Linq高级查、分页、组合查询)
一.linq高级查 1.模糊查(包含) 1 public List<User> Select(string name) 2 { 3 return con.User.Where(r => ...