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 AddElement
lệ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 Undo
và Redo
được lưu trữ trong FormMain
lớ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.
Receiver
từng đối tượng lệnh, tôi sẽ làm điều này.