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 ...
随机推荐
- 利用chardet检测网页编码
环境:Win7_x64 + python3.4.3 需要先下载chardet并进行安装,下载地址:https://pypi.python.org/packages/source/c/chardet/c ...
- MongoDB管理工具的插件系统
MongoDB管理工具 MongoCola的开发已经进入第三个年头了. 官方对于C#驱动的投入不够导致了很多东西都必须自己实现,但是不管怎么样,工具现在已经很强大了. 最近准备着手插件系统的开发,简 ...
- MySQL Workbench gnome-keyring-daemon错误的解决
在Fedora下安装了一个MySQL Workbench,运行,连接数据库,在Store in Keychain时出现了gnome-keyring-daemon错误,不能保存密码,也就连不上数据库. ...
- 说说Java生态圈的那些事儿
文章目录: 1.生态圈概述. 2.说说Java,高级Java,Java生态圈的衍生 3. 说说servlet.servlet容器.比较tomcat.jetty.tomcat.jboss: 1. 哪个项 ...
- Java.io.DataInputStream.readInt()
1. 代码 import java.io.DataInputStream; import java.io.IOException; public class Test { public static ...
- SpringMVC 邮件发送
<!--邮件发送实现类--> <bean id="javaMailSender" class="org.springframework.mail.jav ...
- servlet的开发流程介绍
servlet的开发部署流程 1.在%TOMCAT_HOME%/webapps下WEB-INF的文件夹,写一个文件web.xml(该网站的配置信息),建立一个classes的子文件夹,也可以从别的目录 ...
- JSON.stringify()和JOSN.parse()
JSON.stringify()跟JSON.parse() 终于把这两个方法搞清楚了!!! JSON.tringify():把一个json数据转化成JSON string JSON.stringify ...
- MasonJS – 创建完美的砌体结构网页布局
MasonJS 插件用来解决目前大多数的网格系统使用中的问题——间距.当使用 Masonry,Isotope 或任何其他网格插件时,布局中会出现空白或边缘参差不齐的情况.MasonJS 可以帮助你填补 ...
- Squire – 简洁的 HTML5 富文本编辑器
Squire 是一个简洁的 HTML5 富文本编辑器,它提供了强大的跨浏览器的标准化,超级轻巧灵活.它是建立在现在和未来并作为研究,因此并不支持那些古老的浏览器. 在线演示 源码下载 您可能 ...