Frage

Ich arbeite an einer Windows forms .Net-Anwendung mit der basic UI, die Symbolleiste enthält Schaltflächen, Menüelemente und Tastenkombinationen, die alle die selben zugrunde liegenden code.Jetzt den event-Handler für jede dieser Aufruf eine gängige Methode, um die Funktion auszuführen.

Von dem, was ich gelesen habe, diese Art von Aktion konnte nicht bearbeitet werden können, indem der Befehl design-Muster mit dem zusätzlichen Vorteil der automatisch aktivieren/deaktivieren oder aktivieren/deaktivieren der UI-Elemente.

Ich habe auf der Suche im Netz für ein gutes Beispiel-Projekt, aber habe nicht wirklich eine gefunden.Hat jemand ein gutes Beispiel, die geteilt werden können?

War es hilfreich?

Lösung

Lassen Sie uns zuerst sicherstellen, dass wir wissen, was der Befehl Muster:

Befehl-Muster kapselt einen Antrag als ein Objekt und macht es bekannt öffentliche Schnittstelle.Befehl Muster stellt sicher, dass jedes Objekt erhält seine eigene Befehle und bietet eine Entkopplung zwischen sender und Empfänger.Absender ist ein Objekt ruft eine Betrieb, und ein Empfänger wird ein Objekt empfängt die Anforderung und wirkt auf es.

Hier ist ein Beispiel für Sie.Es gibt viele Möglichkeiten, wie Sie dies tun können, aber ich werde nehmen Sie eine Schnittstelle base-Ansatz zu machen, der code mehr getestet für Sie.Ich bin nicht sicher, welche Sprache Sie bevorzugen, aber ich Schreibe dies in C#.

Erstellen Sie zunächst eine Schnittstelle, die beschreibt, ein Befehl.

public interface ICommand
{
    void Execute();
}

Zweitens, erstellen Sie den Befehl Objekte implementieren, die die Kommando-Schnittstelle.

public class CutCommand : ICommand
{
    public void Execute()
    {
        // Put code you like to execute when the CutCommand.Execute method is called.
    }
}

Drittens müssen wir, um setup unsere invoker-oder sender-Objekt.

public class TextOperations
{
    public void Invoke(ICommand command)
    {
        command.Execute();
    }
}

Viertens, erstellen Sie das client-Objekt, das die invoker/sender-Objekt.

public class Client
{
    static void Main()
    {
        TextOperations textOperations = new TextOperations();
        textOperation.Invoke(new CutCommand());
    }
}

Ich hoffe, Sie können nehmen Sie dieses Beispiel und setzen es in verwenden für die Anwendung, die Sie arbeiten auf.Wenn Sie möchten, dass mehr Aufklärung, lassen Sie es mich wissen.

Andere Tipps

Ihr auf dem richtigen Weg.Im Grunde haben Sie ein Modell, das für das Dokument.Verwenden Sie dieses Modell in den CutCommand.Sie wollen zu ändern die CutCommand Konstruktor zu akzeptieren, die Informationen, die Sie Ausschneiden möchten.Dann jedesmal, wenn, sagen die Cut-Taste angeklickt wird, man sich auf eine neue CutCommand und die übergabe der Argumente im Konstruktor.Dann nutzen Sie diese Argumente in der Klasse, wenn die Methode Execute aufgerufen wird.

Versuchen Sie, open source, .NET-Editoren wie SharpDevelop oder Notepad++.

Es ist (natürlich) einige Diskussionen über den Befehl Muster http://c2.com/cgi/wiki?CommandPattern das könnte hilfreich sein.

Qt verwendet Befehl Muster für die Menüleiste/Toolbar-Elemente.

QActions erstellt werden getrennt von QMenuItem und QToolbar, und die Aktionen, die zugewiesen werden können QMenuItem und QToolbar mit setAction() und addAction () - Methode, beziehungsweise.

http://web.archive.org/web/20100801023349/http://cartan.cas.suffolk.edu/oopdocbook/html/menus.html

http://web.archive.org/web/20100729211835/http://cartan.cas.suffolk.edu/oopdocbook/html/actions.html

Ich kann dir nicht helfen, mit Beispiel-link, aber kann Beispiel von mir.

1) Definieren, die ICommand-Schnittstelle:

public interface ICommand {
   void Do();
   void Undo();
}

2) Tun Sie Ihre ICommand-Implementierungen für konkrete Befehle, sondern auch definieren, abstrakte Basis-Klasse für Sie:

public abstract class WinFormCommand : ICommand {

}

3) Create-Befehl invoker:

public interface ICommandInvoker {
  void Invoke(ICommand command);
  void ReDo();
  void UnDo();
}

public interface ICommandDirector {
  void Enable(ICommand);
  void Disable(ICommand);
}

public class WinFormsCommandInvoker : ICommandInvoker, ICommandDirector {

    private readonly Dictionary<ICommand, bool> _commands;
    private readonly Queue<ICommand> _commandsQueue;       
    private readonly IButtonDirector _buttonDirector;

    // you can define additional queue for support of ReDo operation

    public WinFormsCommandInvoker(ICommandsBuilder builder, IButtonDirector buttonDirector) {
      _commands = builder.Build();
      _buttonDirector = buttonDirector;
      _commandsQueue = new Queue<ICommand>();
    } 

    public void Invoke(ICommand command) {
        command.Do();
        __commandsQueue.Enqueue(command);
    }

    public void ReDo() {
      //you can implement this using additional queue
    }

    public void UnDo() {
      var command = __commandsQueue.Dequeue();
      command.Undo();
    }

    public void Enable(ICommand command) {
      _commands.[command] = true;
      _buttonDirector.Enable(command);
    }

    public void Disable(ICommand command) {
      _commands.[command] = false;
      _buttonDirector.Disable(command); 
    }
}

4) Jetzt können Sie setzen Ihre ICommandsBuilder, IButtonDirector und fügen Sie andere Schnittstellen, wie ICheckBoxDirector zu WinFormsCommandInvoker.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top