Как реализовать пользовательскую отмену в TextBox - PullRequest
1 голос
/ 12 июля 2011

Я бы хотел вручную внедрить базовую систему отмены для TextBox (из-за проблем, упомянутых в моем последнем вопросе ). Я пытался делать это часами, но не могу найти способ. Кто-нибудь знает, возможно ли это?

Кажется, что для этого потребуется, например, обнаружить, что пользователь изменил позицию каретки, но я не могу понять, как это сделать. Конечно, я могу прослушивать клавиши со стрелками и обнаруживать щелчки мыши, но, по-видимому, невозможно - по крайней мере, в случае клавиш со стрелками - фактически определить, изменилось ли в SelectionStart значение . 1007 *

Если у кого-то есть идеи, я был бы благодарен.

Tom

Ответы [ 3 ]

3 голосов
/ 28 декабря 2012

Это решение, которое я разработал и прекрасно работает для меня:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace INQ_adm.Forms.ControlsX
{
    public class TextBoxX : TextBox
    {
        private static int UNDO_LIMIT = 0;
        private List<Item> LastData = new List<Item>();
        private int undoCount = 0;
        private Boolean undo = false;

        public TextBoxX()
        {
            InitializeComponent();
        }

       protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == (Keys.Control | Keys.Z))
            {
                undo = true;
                try
                {
                    ++undoCount;
                    this.Text = LastData[LastData.Count - undoCount - 1].text;
                    this.SelectionStart = LastData[LastData.Count - undoCount - 1].position;
                    this.PerformLayout();
                }
                catch
                {
                    --undoCount;
                }

                undo = false;
                return true;
            }

            if (keyData == (Keys.Control | Keys.Y))
            {
                undo = true;
                try
                {
                    --undoCount;
                    this.Text = LastData[LastData.Count - undoCount + 1].text;
                    this.SelectionStart = LastData[LastData.Count - undoCount + 1].position;
                    this.PerformLayout();
                }
                catch
                {
                    ++undoCount;
                }

                undo = false;
                return true;
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

        private void textBoxX_TextChanged(object sender, EventArgs e)
        {
            if (!undo)
            {
                LastData.RemoveRange(LastData.Count - undoCount, undoCount);
                LastData.Add(new Item(this.Text, this.SelectionStart));
                undoCount = 0;
                    if (UNDO_LIMIT != 0 && UNDO_LIMIT + 1 < LastData.Count)
                {
                    LastData.RemoveAt(0);
                }
            }
        }

        private void InitializeComponent()
        {
            this.TextChanged += new System.EventHandler(this.textBoxX_TextChanged);
        }
    }

    public class Item
    {
        public String text;
        public int position;

        public Item(String text, int position)
        {
            this.text = text;
            this.position = position;
        }
    }
}
2 голосов
/ 12 июля 2011

Можете ли вы обработать событие TextChanged и просто помещать содержимое текстового поля в стек каждый раз, когда оно изменяется, а затем вставлять и обновлять TextBox каждый раз, когда пользователь нажимает Ctrl-Z?

0 голосов
/ 12 июля 2011

Это немного устарело, но звучит именно так, как вам нужно: http://msmvps.com/blogs/peterritchie/archive/2006/09/10/Changing-TextBox-Text-as-an-Undo_2D00_able-Action.aspx

Чтобы подвести итог, когда вы выполняете замену вкладки, просто выделите весь текст в поле, добавьте 4 пробела, а затем вставьте весь текст обратно в поле.

Это должно позволить пользователю нажать Ctrl + Z, чтобы отменить все это. Теперь я понятия не имею, что произойдет, если они будут продолжать печатать после пробелов ... Я предполагаю, что все это будет удалено из нажатия Ctrl + Z.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...