ฉันพยายามใช้รูปแบบคำสั่งสำหรับการนำ Undo และ Redo ไปใช้ในโครงการของฉัน
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);
}
}
การดำเนินการตามคำสั่งในAddElement
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";
}
}
...
Undo
และRedo
สแต็คจะถูกเก็บไว้ในFormMain
ชั้นเรียนและจะถูกส่งผ่านไปสู่รูปแบบการแก้ไข
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;
เมื่อFormEdit
ผู้ใช้ใหม่คลิกที่ปุ่มทำซ้ำหรือเลิกทำฟังก์ชั่นที่เกี่ยวข้องในนั้นFormEdit
จะถูกดำเนินการ แต่เมื่อฉันตรวจสอบตัวรับสัญญาณของคำสั่งนี้เป็นรูปแบบที่คำสั่งถูกสร้างขึ้นครั้งแรกและตอนนี้อาจถูกกำจัด ฉันคาดหวังว่าโปรแกรมจะทำให้เกิดข้อผิดพลาด แต่ดูเหมือนว่าCommand
วัตถุจะเก็บการอ้างอิงถึงรูปแบบเก่าและสิ่งนี้นำไปสู่การประพฤติมิชอบ
ดังนั้นฉันคิดว่าฉันต้องค้นหาผู้รับที่สอดคล้องกันสำหรับคำสั่งไม่ว่าจะเป็นรูปแบบหลักหรือการควบคุมเว็บเบราเซอร์ซึ่งมีเวลาชีวิตเช่นเดียวกับคำสั่งของตัวเอง แต่ถึงกระนั้นฉันควรจะสามารถเข้าถึงการควบคุมบางอย่างที่เกี่ยวข้องกับคำสั่ง
สถานที่ที่ดีที่สุดในการใช้ฟังก์ชั่นคำสั่งเป็นผู้รับCommand
วัตถุคืออะไร? หรือวิธีอื่นใดในการเชื่อมโยงแบบฟอร์มใหม่กับคำสั่งที่เปิดจากสแต็ก
Receiver
ของแต่ละวัตถุคำสั่งฉันจะทำเช่นนี้