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="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Menu Grid.Row="0">
            <MenuItem Header="File" />
            <MenuItem Header="Copy" />
            <MenuItem Header="Paste" />
            <MenuItem Header="Cut" />
            <MenuItem Header="Delete" />
        </Menu>
        <ToolBar Grid.Row="1">
            <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="2" Text="WordPad" FontSize="30" 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 > 0)
    {
        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="2" Text="WordPad" FontSize="30" TextWrapping="Wrap" Height="Auto" Width="Auto" Margin="5">
            <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 > 0;
  pasteItem.IsEnabled = Clipboard.ContainsText();}

TextBox同理

<TextBox x:Name="text" ContextMenuOpening="text_ContextMenuOpening">

快捷键与工具栏同上

一个简易的写字板程序完成了,但是有没有发现很麻烦呢,下一期更新WordPad2.0版

To be continue...

时间: 2024-11-05 00:42:16

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

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

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

WPF学习之路(四)路由

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

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

WordPad 2.0 上一期实现了一虽然建议但是功能比较全面的Wordpad程序,但是程序代码略显繁琐,这一期更新改进版. MainWindows.xaml 添加 <Window.CommandBindings>节点,响应保存和关闭命令 <Window.CommandBindings> <CommandBinding Command="Close" Executed="CloseCommand" /> <CommandBi

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的设计思想是侧重属性胜于方法和事件. 实例 依赖属性对资源引用的支持 设

WPF学习之路(九)导航链接

Hyperlink WPF中超链接类型是Hyperlink,除了能在页面之间导航,还能再同一个页面下进行段落导航 实例: <Grid> <FlowDocumentReader> <FlowDocument> <Section LineHeight="25" FontSize="15"> <List> <ListItem> <Paragraph> <Hyperlink Navig

【WPF学习】第五十一章 动画缓动

线性动画的一个缺点是,它通常让人觉得很机械且不能够自然.相比而言,高级的用户界面具有模拟真实世界系统的动画效果.例如,可能使用具有触觉的下压按钮,当单击时按钮快速弹回,但是当没有进行操作时它们会慢慢地停下来,创建真正移动的错觉.或者,可能使用类似Windows操作系统的最大化和最小化效果,当窗口解决最终尺寸时窗口扩展或收缩的速度会加速.这些细节十分细微,当它们的实现比较完美时可能不会注意到它们.然而,几乎总会注意到,粗糙的缺少这些更细微特征的动画会给人留下笨拙的印象. 改进动画并创建更趋自然的动