How to: Replace a Built-In Command with a Custom Command in Rich Text Editor for WinForms
- 3 minutes to read
To change the actions performed when the built-in command is executed, use the service substitution technique. Create the IRichEditCommandFactoryService descendant which generates custom commands and use the RichEditControl.ReplaceService<T> method (or the GetService -> RemoveService -> AddService method sequence) to replace default service with a newly created service.
Create A Service Descendant
The following code implements the IRichEditCommandFactoryService descendant which generates customized SaveDocumentCommand and SaveDocumentAsCommand commands. The command descendants override the ExecuteCore
methods to display a message after a document has been saved. The IsModified
internal property indicates unsaved changes in the document. If this property is not changed to false
after saving a document, it signals that the save action failed.
public class CustomRichEditCommandFactoryService : IRichEditCommandFactoryService
{
readonly IRichEditCommandFactoryService service;
readonly RichEditControl control;
public CustomRichEditCommandFactoryService(RichEditControl control, IRichEditCommandFactoryService service)
{
Guard.ArgumentNotNull(control, "control");
Guard.ArgumentNotNull(service, "service");
this.control = control;
this.service = service;
}
public RichEditCommand CreateCommand(RichEditCommandId id) {
if (id == RichEditCommandId.FileSaveAs) {
return new CustomSaveDocumentAsCommand(control);
}
if (id == RichEditCommandId.FileSave) {
return new CustomSaveDocumentCommand(control);
}
return service.CreateCommand(id);
}
}
public class CustomSaveDocumentCommand : SaveDocumentCommand {
public CustomSaveDocumentCommand(IRichEditControl richEdit) : base(richEdit) { }
protected override void ExecuteCore() {
base.ExecuteCore();
if (!DocumentServer.Modified) {
MessageBox.Show("Document is saved successfully");
}
}
}
public class CustomSaveDocumentAsCommand : SaveDocumentAsCommand {
public CustomSaveDocumentAsCommand(IRichEditControl richEdit) : base(richEdit) { }
protected override void ExecuteCore() {
DocumentServer.Modified = true;
base.ExecuteCore();
if (!DocumentServer.Modified) {
MessageBox.Show("Document is saved successfully");
}
}
}
Substitute the Service
The following code replaces the IRichEditCommandFactoryService service with its customized descendant.
var builtInService = richEditControl1.GetService<IRichEditCommandFactoryService>();
var myCommandFactory = new CustomRichEditCommandFactoryService(richEditControl1,builtInService);
richEditControl1.ReplaceService<IRichEditCommandFactoryService>(myCommandFactory);