Ho provato a utilizzare il modello di comando per implementare Annulla e Ripeti nel mio progetto
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);
}
}
Implementazione del AddElement
comando in 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";
}
}
...
gli stack Undo
e Redo
vengono archiviati nella FormMain
classe e passati al modulo dell'editor.
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;
Quando in un nuovo FormEdit
utente l'utente fa clic sul pulsante Ripeti o Annulla, FormEdit
viene eseguita la funzione corrispondente in , ma come ho verificato questo ricevitore del comando è la forma in cui il comando è stato creato per la prima volta e ora potrebbe essere stato eliminato. Mi aspetto che il programma generi un errore, ma sembra che l' Command
oggetto memorizzi un riferimento alla vecchia forma e questo porta a comportamenti scorretti.
Pertanto, penso di dover trovare un ricevitore coerente per i comandi, sia nella forma principale che nel controllo webBrowser, che abbia la stessa durata dei comandi stessi. Tuttavia, dovrei avere accesso ad alcuni controlli relativi ai comandi.
Qual è il posto migliore per implementare le funzioni di comando come ricevitore di Command
oggetti? O qualsiasi altro modo per associare il nuovo modulo a un comando estratto dallo stack.
Receiver
oggetto di ciascun comando, lo farò.