KeyBindings 看起来很复杂,需要在几个步骤中定义(也取决于要求)。此答案是对user1892538 答案的奖励。
场景:我们得到了已经显示的toolWindow,但是我们想添加一些命令,它会调用view/view-model中的方法。
1.创建新的Command(步骤 3 在this 教程中):
右键单击项目 -> 添加New Item -> Custom command。这将创建 2 个文件并使用包修改文件:
-
CommandName.png - 菜单图标
-
CommandName.cs - 包含命令源代码的类文件
-
ProjectWindowPackage.cs - 带有Initialize()方法的包类,它调用CommandName.cs的Initialize()
MyWindowPackage.cs:
public sealed class MyWindowPackage : Package
{
public const string PackageGuidString = "00000000-0000-0000-0000-000000000003";
public MyWindowPackage() { }
protected override void Initialize()
{
MyToolWindowCommand.Initialize(this);
MySaveCommand.Initialize(this);
base.Initialize();
}
}
CommandName.cs:
// these 2 values will do the binding
public static readonly Guid ApplicationCommands
= new Guid("00000000-0000-0000-0000-000000000002");
public const int SaveCommandId = 0x0201;
private readonly Package package;
private CommandName(Package package)
{
// we need to have package (from Initialize() method) to set VS
if (package == null) throw new ArgumentNullException("package");
this.package = package;
// this provides access for the Menu (so we can add our Command during init)
OleMenuCommandService commandService = this.ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
if (commandService != null)
{
// Creates new command "reference" (global ID)
var menuCommandID = new CommandID(ApplicationCommands, SaveCommandId);
// Create new command instance (method to invoke, ID of command)
var menuItem = new MenuCommand(this.Save, menuCommandID);
// Adding new command to the menu
commandService.AddCommand(menuItem);
}
private void Save()
{
// Get instance of our window object (param false -> won't create new window)
ToolWindowPane lToolWindow = this.package.FindToolWindow(typeof(MyToolWindow), 0, false);
if ((null == lToolWindow) || (null == lToolWindow.Frame)) return;
// Handle the toolWindow's content as Window (our control)
((lToolWindow as MyToolWindow)?.Content as MyWindowControl)?.Save();
}
}
2。将 MyToolWindow 的内容设置为 MyWindowControl(在 VSIX 创建时完成):
MyToolWindow.cs:
[Guid("00000000-0000-0000-0000-000000000001")] //GUID of ToolWindow
public class MyToolWindow : ToolWindowPane
{
public MyToolWindow() : base(null)
{
this.Content = new MyWindowControl();
}
}
3.在代码隐藏中设置代码以调用 ViewModel(或自己完成工作):
MyWindowControl.cs:
public partial class MyWindowControl : UserControl
{
// output omitted for brevity
public void Save()
{
// Do the call towards view-model or run the code
(this.DataContext as MyViewModel)?.SaveCmd.Execute(null);
}
}
4.将 Command 设置为 Shortcut 以便 VS 知道如何处理它们:
在MZTools' article 中可以找到解决方案如何添加Command 而不会在菜单中看到它,但是如果您转到工具-> 窗口-> 键盘,您可能会在那里找到它们(因此您可以设置快捷方式) .
我将同时显示原点Button(用于显示工具窗口)和第二个不可见的Button,仅用于快捷方式(Keybind)。
MyWindowPackage.vsct(分几部分):
<!-- shows the definition of commands/buttons in menu, Canonical name is how You can find the command in VS [Tools -> Keyboard -> CommandName] -->
<Commands package="guidMyWindowPackage">
<Button guid="guidMyWindowPackageCmdSet"
id="MyWindowCommandId"
priority="0x0100"
type="Button">
<Parent guid="guidSHLMainMenu" id="IDG_VS_WNDO_OTRWNDWS1" />
<Strings>
<ButtonText>My ToolWindow</ButtonText>
<CommandName>MyCommand</CommandName>
<MenuText>My ToolWindow</MenuText>
<LocCanonicalName>MyToolWindow</LocCanonicalName>
</Strings>
</Button>
<Button guid="guidMyWindowPackageCmdSet"
id="MySaveCommandId"
priority="0x0100"
type="Button">
<Strings>
<ButtonText>My ToolWindow Save</ButtonText>
<LocCanonicalName>MyToolWindow.Save</LocCanonicalName>
</Strings>
</Button>
</Buttons>
</Commands>
KeyBindings(快捷键定义):
<KeyBindings>
<KeyBinding guid="guidMyWindowPackageCmdSet"
id="MySaveCommandId"
editor="guidVSStd97"
key1="1" mod1="Control" />
</KeyBindings>
还有Symbols,它将GUID、Command definition和Command logic设置并绑定在一起:
<Symbols>
<!-- This is the package guid. -->
<GuidSymbol name="guidMyWindowPackage" value="{00000000-0000-0000-0000-000000000003}" />
<!-- This is the guid used to group the menu commands together -->
<GuidSymbol name="guidMyWindowPackageCmdSet" value="{00000000-0000-0000-0000-000000000002}">
<IDSymbol name="MyWindowCommandId" value="0x0100" />
<IDSymbol name="MySaveCommandId" value="0x0201" />
</GuidSymbol>
<!-- some more GuidSymbols -->
</Symbols>
奖励:
KeyBinding 确实有属性editor="guidVSStd97",这会将绑定范围设置为“GENERAL”(可在每个窗口中使用)。如果您可以将其设置为您的ToolWindow 的GUID,则仅在选择ToolWindow 时才会使用。它是如何工作的,描述为behind this link。要完成它,请访问this link。