我正在尝试制作简单的Windows窗体应用程序。我将文本写入TextBox,每次我这样做时,文本都会被推送到列表中,所以我们有了所有的文本条件。所以我们有“后退”按钮来使用它。buttonBack.Click工作得很好...但box.TextChanged并非如此。我希望每次更改文本时都调用此事件
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Drawing;
namespace TextBox
{
class Revision
{
public string Text { get; set; }
public int CoursorPosition { get; set; }
}
class MyForm : Form
{
static RichTextBox box = new RichTextBox();
static List<Revision> revisions = new List<Revision>();
static void MakeRevision()
{
revisions.Add(new Revision
{
Text = box.Text,
CoursorPosition = box.SelectionStart
});
}
public MyForm()
{
var buttonBack = new Button()
{
Location = new Point(0, 0),
Size = new Size(ClientSize.Width, 30),
Text = "Back"
};
box.Size = new Size(ClientSize.Width, 100);
box.Multiline = true;
box.Location = new Point(0, buttonBack.Bottom);
box.TextChanged += (sender, args) => MakeRevision();
box.MouseDown += (sender, args) => MakeRevision();
Controls.Add(buttonBack);
Controls.Add(box);
buttonBack.Click += (sender, args) =>
{
box.Text = revisions.Last().ToString();
revisions.RemoveAt(revisions.IndexOf(revisions.Last()));
};
}
public static void Main()
{
var form = new MyForm();
Application.Run(form);
}
}
}发布于 2017-12-17 15:31:41
我相信它不起作用,因为当你从“后退”按钮更新文本时,它会将它添加到堆栈中,这样看起来后退按钮就不起作用了,但实际上它是起作用的。您只需要评估文本更改是否应该添加到堆栈中。下面是一个例子。
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Drawing;
namespace TextBox
{
class Revision
{
public string Text { get; set; }
public int CoursorPosition { get; set; }
}
class MyForm : Form
{
static RichTextBox box = new RichTextBox();
static List<Revision> revisions = new List<Revision>();
static bool loading = false;
static void MakeRevision()
{
if (loading)
return;
revisions.Add(new Revision
{
Text = box.Text,
CoursorPosition = box.SelectionStart
});
}
public MyForm()
{
var buttonBack = new Button()
{
Location = new Point(0, 0),
Size = new Size(ClientSize.Width, 30),
Text = "Back"
};
box.Size = new Size(ClientSize.Width, 100);
box.Multiline = true;
box.Location = new Point(0, buttonBack.Bottom);
box.TextChanged += (sender, args) => MakeRevision();
box.MouseDown += (sender, args) => MakeRevision();
Controls.Add(buttonBack);
Controls.Add(box);
buttonBack.Click += (sender, args) =>
{
if (revisions.Count > 0)
{
loading = true;
box.Text = revisions.Last().Text;
box.SelectionStart = revisions.Last().CoursorPosition;
box.Focus();
revisions.RemoveAt(revisions.IndexOf(revisions.Last()));
loading = false;
}
};
}
public static void Main()
{
var form = new MyForm();
Application.Run(form);
}
}
}我还更改了发送回buttonBack.Click事件中的文本框的内容。
https://stackoverflow.com/questions/47852561
复制相似问题