当前位置:首页 > 科技  > 软件

WPF开发:使用命令模式实现Undo和Redo功能

来源: 责编: 时间:2024-04-26 17:35:29 288观看
导读Undo 和 Redo 功能是许多应用程序都需要的功能。它允许用户在执行某些操作后,可以将操作撤销或重做。在 WPF开发 中,实现 Undo 和 Redo 功能有多种方式,其中一种常用的方式是使用命令模式。命令模式将操作封装成一个命令

Undo 和 Redo 功能是许多应用程序都需要的功能。它允许用户在执行某些操作后,可以将操作撤销或重做。在 WPF开发 中,实现 Undo 和 Redo 功能有多种方式,其中一种常用的方式是使用命令模式。命令模式将操作封装成一个命令对象,然后将命令对象存储在一个栈中。当用户执行 Undo 或 Redo 操作时,从栈中取出一个命令对象,并执行命令对象的 Undo 或 Redo 方法。QAF28资讯网——每日最新资讯28at.com

1. 命令模式概述

QAF28资讯网——每日最新资讯28at.com

命令模式是一种行为设计模式,它允许将操作封装为独立的对象,从而使得可以对操作进行参数化、队列化、记录日志等。在命令模式中,每个命令都是一个对象,包含了执行操作所需的所有信息。QAF28资讯网——每日最新资讯28at.com

设计思路

使用命令模式实现 Undo 和 Redo 功能的设计思路如下:QAF28资讯网——每日最新资讯28at.com

  • 创建一个 ICommand 接口,用于封装具体的操作。
  • 创建一个 AddTextCommand类,RemoveTextCommand类来实现具体的操作。
  • 创建一个 CommandManager类来管理命令对象。

具体实现

ICommand接口

首先,我们需要创建一个通用的命令接口 ICommand,定义了 Execute(执行)、Undo(撤销)和 Redo(重做)方法:QAF28资讯网——每日最新资讯28at.com

public interface ICommand{    void Execute();    void Undo();    void Redo();}

然后,我们可以创建具体的命令类,例如 AddTextCommand 和 RemoveTextCommandQAF28资讯网——每日最新资讯28at.com

public class AddTextCommand : ICommand{    private readonly string _text;    private readonly TextBox _textBox;    public AddTextCommand(string text, TextBox textBox)    {        _text = text;        _textBox = textBox;    }    public void Execute()    {        _textBox.Text += _text;    }    public void Undo()    {        _textBox.Text = _textBox.Text.Remove(_textBox.Text.Length - _text.Length);    }    public void Redo()    {        Execute();    }}public class RemoveTextCommand : ICommand{    private readonly int _startIndex;    private readonly string _removedText;    private readonly TextBox _textBox;    public RemoveTextCommand(int startIndex, int length, TextBox textBox)    {        _startIndex = startIndex;        _removedText = textBox.Text.Substring(startIndex, length);        _textBox = textBox;    }    public void Execute()    {        _textBox.Text = _textBox.Text.Remove(_startIndex, _removedText.Length);    }    public void Undo()    {        _textBox.Text = _textBox.Text.Insert(_startIndex, _removedText);    }    public void Redo()    {        Execute();    }}

接下来,我们需要创建一个命令管理器 CommandManager,用于管理和执行命令:QAF28资讯网——每日最新资讯28at.com

public class CommandManager{    private Stack<ICommand> _undoStack;    private Stack<ICommand> _redoStack;    public CommandManager()    {        _undoStack = new Stack<ICommand>();        _redoStack = new Stack<ICommand>();    }    public void ExecuteCommand(ICommand command)    {        command.Execute();        _undoStack.Push(command);        _redoStack.Clear();    }    public void Undo()    {        if (_undoStack.Count > 0)        {            ICommand command = _undoStack.Pop();            command.Undo();            _redoStack.Push(command);        }    }    public void Redo()    {        if (_redoStack.Count > 0)        {            ICommand command = _redoStack.Pop();            command.Redo();            _undoStack.Push(command);        }    }}

最后,在 WPF 应用程序中使用上述代码:QAF28资讯网——每日最新资讯28at.com

public partial class MainWindow : Window{    private readonly CommandManager _commandManager;    public MainWindow()    {        InitializeComponent();        _commandManager = new CommandManager();    }    private void AddTextButton_Click(object sender, RoutedEventArgs e)    {        string text = TextBox.Text;        ICommand command = new AddTextCommand(text, TextBox);        _commandManager.ExecuteCommand(command);    }    private void RemoveTextButton_Click(object sender, RoutedEventArgs e)    {        int startIndex = TextBox.SelectionStart;        int length = TextBox.SelectionLength;        ICommand command = new RemoveTextCommand(startIndex, length, TextBox);        _commandManager.ExecuteCommand(command);    }    private void UndoButton_Click(object sender, RoutedEventArgs e)    {        _commandManager.Undo();    }    private void RedoButton_Click(object sender, RoutedEventArgs e)    {        _commandManager.Redo();    }}

在这个案例中,我们使用了一个 CommandManager 对象来管理和执行命令。当点击 “AddTextButton” 按钮时,会创建一个 AddTextCommand 命令对象,并将其添加到 CommandManager 中执行。点击 “RemoveTextButton” 按钮时,同样会创建一个 RemoveTextCommand 命令对象,并执行。点击 “UndoButton” 和 “RedoButton” 按钮时,分别调用 CommandManager  Undo()  Redo() 方法来撤销和重做操作。QAF28资讯网——每日最新资讯28at.com

通过命令模式,我们可以很方便地实现Undo和Redo功能,并且能够更好地组织和管理代码。在WPF应用程序中,结合命令模式可以更好地处理用户操作,提供更好的交互体验。QAF28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-85876-0.htmlWPF开发:使用命令模式实现Undo和Redo功能

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 一篇学会SpringBoot的核心内容之自动装配

下一篇: 不得不说,在很多业务中,这种模式用得真的很香

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌在KDD 2023发表了一篇工作,探索了推荐系统ranking模型的训练稳定性问题,分析了造成训练稳定性存在问题的潜在原因,以及现有的一些提升模型稳定性方法的不足,并提出了一种新
  • 微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就&ldquo;胡锡进炒股是否知道认真报道&rdquo;展开讨论。有
  • 荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀 Magicbook V 14 2021 曙光蓝版本正式开售,搭载 i7-11390H 处理器与 MX450 显卡,配备 16GB 内存与 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 键盘键程、
Top