Undo-Redo : Programmatically
One of the very essential services while authoring Workflows is Undo-Redo. Common question asked is, how do we get the service outside of VS, in a re-hosted Workflow scenario.
Well, in your re-hosted app(assuming it is WPF), it would be:
Add the following command bindings:
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Undo" Executed="CommandBinding_UndoExecuted" />
<CommandBinding Command="ApplicationCommands.Redo" Executed="CommandBinding_RedoExecuted" />
</Window.CommandBindings>
Next, we need to add the handlers for these bindings, where we invoke the workflow designer services for Undo and Redo.
private void CommandBinding_UndoExecuted(object sender, ExecutedRoutedEventArgs e)
{
this.wd.Context.Services.GetService<UndoEngine>().Undo();
}
private void CommandBinding_RedoExecuted(object sender, ExecutedRoutedEventArgs e)
{
this.wd.Context.Services.GetService<UndoEngine>().Redo();
}
And you are all set, you now have the Undo and Redo services as part of the re-hosted Workflow Designer Application.
One other requirement, that generally comes along with this one, is we want to have the Undo and Redo buttons added to our re-hosted app and how do we enable/disable them. In other words, how do we know that an Undo/Redo has happened. For that, we have two events: UndoUnitAdded and the RedoUnitAdded. Subscribe to these events and this should essentially tell when an Undo/redo has happened.
Event subscription:
UndoEngine undoEngineService;
this.undoEngineService = this.wd.Context.Services.GetService<UndoEngine>();
this.undoEngineService.UndoUnitAdded += new EventHandler<UndoUnitEventArgs>(OnUndoUnitAdded);
The Event handler can be:
void OnUndoUnitAdded(object sender, UndoUnitEventArgs e)
{
MessageBox.Show("Undo Unit Happened");
}
Thanks,
Kushal.
Comments
Anonymous
January 07, 2010
Thanks Kushal, these little code snippets are very useful. I am a new designer. Do you have a central repository of code snippets for beginners? Thank you again! Kaplan SmithAnonymous
January 13, 2010
@kaplan: No I do not have a central repostory. 3 blog posts which can be very useful are: http://blogs.msdn.com/mwinkle http://blogs.msdn.com/cathyk http://blogs.msdn.com/kushals 3 of us have tried to ensure we answer as many customer scenarios as possible. You can always email any of us if you have specific questions about any area. Thanks, Kushal.