Projemde Geri Al ve Yinele'yi uygulamak için Komut Deseni kullanmaya çalıştım
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
Komutun uygulanması 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
ve Redo
yığınlar saklanır FormMain
sınıf ve düzenleyici formuna geçirilir.
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;
Yeni bir FormEdit
kullanıcıda Yeniden Yap veya Geri Al düğmesine tıkladığında, ilgili işlev FormEdit
yürütülür, ancak komutun bu alıcısını kontrol ettiğimde, komutun ilk oluşturulduğu ve şimdi atılabileceği formdur. Programın bir hata oluşturmasını bekliyorum, ancak Command
nesnenin eski forma başvuru kaydettiği ve bu da hatalı davranışa yol açtığı görülüyor .
Bu nedenle, komutların kendileriyle aynı yaşam süresine sahip olan ana form veya webBrowser denetimi için komutlar için tutarlı bir alıcı bulmam gerektiğini düşünüyorum. Ancak komutlarla ilgili bazı denetimlere erişebilmeliyim.
Komut işlevlerini Command
nesnelerin alıcısı olarak uygulamak için en iyi yer nerede ? Veya yeni formu yığından açılan bir komutla ilişkilendirmenin başka bir yolu.
Receiver
her komut nesnesini ayarlayabilmem gerektiğini kastediyorum , bunu yapacağım.