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 ...
随机推荐
- LINQ的Any方法
返回布尔值,判断集合中是否有元素满足某一条件. source code: IEnumerable<string> str = new List<string> { " ...
- Android学习笔记(九) 视图的应用布局效果
最近少了写博客,可能最近忙吧,工作上忙,因为工作原因也忙于学习,也没记录什么了,也没有按照之前的计划去学习了.现在就记录一下最近学到的. 要做Android应用,界面设计少不了,可惜之前一直在用Win ...
- 史上最全系列Android开发环境搭建
一.安装JDK1.JDK下载打开网站http://www.oracle.com/technetwor ... nloads-1880260.html,选择相应的操作系统下载JDK 2.安装JDK本机是 ...
- HTML 5 Web 存储
HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储sessionStorage - 针对一个 session 的数据存储 html5 web sto ...
- Oracle-- (RANK) 排名函数
内容来自: Oracle® Database SQL Language Reference 11g Release 2 (11.2) E41084-03. empolyees表来自hr方案. RANK ...
- input框中的size和maxlength的区别
- 通过HttpWebRequest请求https接口
一.为什么进行代理接口的开发: 有些项目需要访问被墙了哒网站,比如前不久公司开发项目需要使用google地图的接口,而google在中国被墙了,所有打算做一个代理接口服务,将代理放到国外服务器上,通过 ...
- 实用的Scala泛函编程
既然谈到实用编程,就应该不单止了解试试一个新的编程语言那么简单了,最好通过实际的开发项目实例来演示如何编程.心目中已经有了一些设想:想用Scala泛函编程搞一个开源的数据平台应用系统,也就是在云平台P ...
- Java --ClassLoader创建、加载class、卸载class
一.java提供了三种ClassLoader对Class进行加载: 1.BootStrap ClassLoader:称为启动类加载器,是Java类加载层次中最顶层的类加载器,负责加载JDK中的核心类库 ...
- DDD为何叫好不叫座?兼论DCI与业务分析的方法论
今天,仔细阅读了园子里面的一个朋友写的<一缕阳光:DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?>(http://www.cnblogs.com/ ...