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);
}
}
AddElementKomutun 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";
}
}
...
Undove Redoyığınlar saklanır FormMainsı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 FormEditkullanıcıda Yeniden Yap veya Geri Al düğmesine tıkladığında, ilgili işlev FormEdityü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 Commandnesnenin 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 Commandnesnelerin 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.
Receiverher komut nesnesini ayarlayabilmem gerektiğini kastediyorum , bunu yapacağım.