拥有Visual Studio扩展(VSIX)项目:在Window
我们得到UserControl
,其中Button
绑定到某个ICommand
。这可以完美地按预期工作,但是我想附加一个关键的快捷方式(例如: CTRL + S ),它会触发相同的Command
。
我已经检查了几个问题,其中我找到了最有用的代码:
<UserControl.InputBindings>
<KeyBinding Modifiers="Ctrl" Key="Esc" Command="{Binding SaveCmd}"/>
</UserControl.InputBindings>
然而Command
从未被按键发出,我认为问题可能是:
Command
)DependencyProperty
进行绑定的文章
Window
UserControl
上设置绑定
*Package.vsct
中设置绑定并将其路由,因为它在Visual Studio中是Command
问题:我想如何绑定快捷键?我想在哪里放置绑定?
答案 0 :(得分:2)
您是对的,默认的Visual Studio命令使用该快捷方式,优先于扩展名。
来自类似的msdn post,此行为已确认,建议选择不同的组合。
找到reference以获取完整的VS快捷列表。快捷键适用于各种范围(例如,当您在文本编辑器中时,文本编辑器范围的快捷方式优先于全局快捷方式)。 除此之外,您可以customize快捷方式的行为,并导入新的键盘映射方案,并在工具&gt;下选择它。 选项&gt; 环境&gt; 键盘
.vsct中的KeyBindings
部分是您可以将命令与键盘快捷键相关联的位置。 Microsoft示例位于github
答案 1 :(得分:0)
KeyBindings
似乎很复杂,需要在几个步骤上进行定义(也取决于要求)。这个答案是作为user1892538答案的奖励。
场景:我们已经显示了已经显示的toolWindow,但我们想添加一些命令,它将在视图/视图模型中调用方法。
<强> 1。在this教程中创建新的Command
(第3步):
右键单击项目 - &gt;添加New Item
- &gt; Custom command
。这将创建2个文件并使用包修改文件:
CommandName.png
- 菜单的图标 CommandName.cs
- 类文件,包括命令的源代码 ProjectWindowPackage.cs
- 包含Initialize()
方法的包类,该方法调用 Initialize()
<的CommandName.cs
/ em>的 <强> 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"
,这会将绑定范围设置为&#34; GENERAL&#34; (可在每个窗口中使用)。如果您可以将其设置为GUID
的{{1}},则只有在选择ToolWindow
时才会使用此ToolWindow
。如何运作,描述behind this link。要完成它,请转到this link。
答案 2 :(得分:0)
来自user1892538的好答案
另外,请注意操作系统或计算机上运行的其他软件会执行某些快捷方式。
Ctrl + Esc将激活Windows计算机上的开始菜单。
其他例子: - 英特尔图形软件接管Ctrl + Alt + F8。 - 某些Ctrl + Alt组合可能无法通过远程桌面连接。