Skip to content
Robert B Colton edited this page Aug 12, 2016 · 1 revision

Commands are one of the core concepts in Gemini. Commands help you to avoid duplicating code by letting you define command handlers in a single place, regardless of whether the command is invoked through a menu item, toolbar item, or other trigger. Gemini's commands are conceptually similar to WPF commands, but they are more powerful.

First, create a command definition. Here's Gemini command definition for opening files:

[CommandDefinition]
public class OpenFileCommandDefinition : CommandDefinition
{
	public const string CommandName = "File.OpenFile";

	public override string Name
	{
		get { return CommandName; }
	}

	public override string Text
	{
		get { return "_Open"; }
	}

	public override string ToolTip
	{
		get { return "Open"; }
	}

	public override Uri IconSource
	{
		get { return new Uri("pack://application:,,,/Gemini;component/Resources/Icons/Open.png"); }
	}
	
	[Export]
    public static CommandKeyboardShortcut KeyGesture = new CommandKeyboardShortcut<OpenFileCommandDefinition>(new KeyGesture(Key.O, ModifierKeys.Control));
}

Then, provide a command handler. You can do this in one of two ways. For global commands, that don't depend on a document context, create a global handler:

[CommandHandler]
public class OpenFileCommandHandler : CommandHandlerBase<OpenFileCommandDefinition>
{
	public override void Update(Command command)
	{
		// You can enable / disable the command here with:
		// command.Enabled = true;
		
		// You can also modify the command text / icon, which will affect
		// any menu items or toolbar items bound to this command.
	}
	
	public override async Task Run(Command command)
	{
		// ... implement command handling here
	}
}

For commands that depend on a document context, and should be disabled when there is no active document or the active document is not of the correct type, define the command in the document class:

public class MyDocument : Document, ICommandHandler<ClearTextCommandDefinition>
{
	void ICommandHandler<ClearTextCommandDefinition>.Update(Command command)
	{
		command.Enabled = this.Text.Any();
	}

	Task ICommandHandler<ClearTextCommandDefinition>.Run(Command command)
	{
		this.Text = string.Empty;
		return TaskUtility.Completed;
	}
}

To remove built-in keyboard shortcuts, you can exclude them declaratively:

[Export]
public static ExcludeCommandKeyboardShortcut ExcludeFileOpenShortcut = new ExcludeCommandKeyboardShortcut(OpenFileCommandDefinition.KeyGesture);

To find out how to bind commands to menus or toolbars, see the "MainMenu" and "ToolBars" modules below.

Clone this wiki locally