Tôi đã cố gắng sử dụng Mẫu lệnh để triển khai Hoàn tác và Làm lại trong dự án của mình
public abstract class Command
{
protected Form Receiver { set; get; }
protected HtmlElement Element { set; get; }
abstract public void ReDo();
abstract public void UnDo();
public Command(Form receiver)
{
this.Receiver = receiver;
}
}
class AddElementCmd : Command
{
public AddElementCmd(HtmlElement elem, Form receiver)
: base(receiver)
{
Element = elem;
}
public override void ReDo()
{
((FormEdit)Receiver).AddElement(Element,false);
}
public override void UnDo()
{
((FormEdit)Receiver).DelElement(Element, false);
}
}
class DelElementCmd : Command
{
public DelElementCmd(HtmlElement elem, Form receiver)
: base(receiver)
{
Element = elem;
}
public override void ReDo()
{
((FormEdit)Receiver).DelElement(Element, false);
}
public override void UnDo()
{
((FormEdit)Receiver).AddElement(Element, false);
}
}
Thực hiện AddElementlệnh trong FormEdit.
public void AddElement(HtmlElement elem, bool isNew = true)
{
IHTMLElement2 dom = elem.DomElement as IHTMLElement2;
if (isNew)
{
Command cmd = new AddElementCmd(elem, this);
Undo.Push(cmd);
Redo.Clear();
}
// some codes here....
if (showAlltoolStripButton.Checked)
{
dom.runtimeStyle.visibility = "hidden";
}
else if (showSelectionToolStripButton.Checked)
{
dom.runtimeStyle.visibility = "visible";
}
}
...
các ngăn xếp Undovà Redođược lưu trữ trong FormMainlớp và được chuyển đến dạng trình soạn thảo.
public Stack<Command> Undo = new Stack<Command>();
public Stack<Command> Redo = new Stack<Command>();
....
FormEdit editor = new FormEdit ();
editor.Browser = webBrowser1;
editor.addedElements = addedElements;
editor.restoreElements = restoreElements;
editor.Undo = Undo;
editor.Redo = Redo;
Khi ở trạng thái mới FormEdit, người dùng nhấp vào nút Làm lại hoặc Hoàn tác, chức năng tương ứng trong đó FormEditđược thực thi, nhưng khi tôi kiểm tra bộ nhận lệnh này là hình thức mà lệnh được tạo lần đầu tiên và bây giờ có thể đã bị loại bỏ. Tôi hy vọng rằng chương trình đưa ra một lỗi, nhưng có vẻ như Commandđối tượng lưu trữ một tham chiếu đến biểu mẫu cũ và điều này dẫn đến hành vi sai.
Do đó, tôi nghĩ rằng tôi phải tìm một bộ thu phù hợp cho các lệnh, dưới dạng chính hoặc điều khiển webBrowser, có cùng thời gian với chính các lệnh. Nhưng tôi nên có quyền truy cập vào một số điều khiển liên quan đến các lệnh.
Đâu là nơi tốt nhất để thực hiện các chức năng lệnh như là người nhận các Commandđối tượng? Hoặc bất kỳ cách nào khác để liên kết biểu mẫu mới với một lệnh xuất hiện từ ngăn xếp.
Receivertừng đối tượng lệnh, tôi sẽ làm điều này.