我创建了一个ToggleButton
来显示和隐藏一段用户界面,我已将其Content
发送到一个图标。
我现在想要为ToggleButton
添加快捷键,但我不确定如何在不绑定命令的情况下执行操作。由于我所做的只是绑定到IsChecked
状态,所以我不需要命令来执行任何其他功能,并且创建一个空功能似乎不正确。
这是我的ToggleButton
,因为当我按下指示的快捷键时,它当前不起作用并且没有响应。
<ToggleButton ToolTip="Command History"
MinWidth="24"
IsChecked="{Binding IsShowHistoryChecked}"
Margin="7">
<ToggleButton.InputBindings>
<KeyBinding Gesture="Ctrl+H" />
</ToggleButton.InputBindings>
<Image Source="/Amuse;component/Images/ComHistory256.png"
Width="24" />
</ToggleButton>
答案 0 :(得分:11)
ToggleButton本身的InputBinding不会起作用,但是有两个很好的WPF解决方案可以解决你的问题:
为什么您的InputBinding解决方案无法正常工作
您当前定义的InputBinding将不起作用,因为它没有列出命令。创建一个切换按钮的命令很容易,如下所示:
public void Execute(object parameter)
{
((ToggleButton)parameter).IsChecked = !((ToggleButton)parameter).IsChecked;
}
然而,这无法实现您的目标。即使按钮未聚焦,您也希望Ctrl-H切换按钮 。 InputBinding不会为您完成此操作,因为它仅在按钮具有焦点时才起作用。我现在将讨论您可以使用的两种解决方案。
选项1:使用更新模型的RoutedCommand
WPF体系结构的重点在于您从不需要首先“切换按钮”:概念上,WPF中的所有键盘和鼠标操作都应该用于切换模型或视图模型中的绑定属性。然后ToggleButton成为接受鼠标点击的机制,但不一定是唯一的。
您为“IsShowHistoryChecked”属性选择的名称表示您对视图模型进行概念化的基本问题。您的视图模型不应该围绕视图设计 - 而是应该公开逻辑概念,例如“ShowHistory”属性。视图可以将其绑定到CheckBox或ToggleButton,或者它可以选择其他一些机制,或者根本不暴露它。数据绑定和视图模型的重点在于,在创建视图模型时,您并不关心实际视图的样子。事实上,在自动化单元测试期间,没有复选框,因此“IsShowHistoryChecked”显然是一个真正的误称。
因此,假设您已将视图与视图模型正确分离,并且您具有“ShowHistory”属性。首先在视图模型中实现“ToggleShowHistory”命令,该命令在执行时切换ShowHistory属性。现在你所要做的就是在视图级别为此命令分配一个Ctrl-H的InputBinding,你就完成了。即使从视图中完全删除了ToggleButton,InputBinding仍然会生效,Ctrl-H仍然可以正常工作。 Nirvanna。
选项2:注册访问密钥
Windows有一种标准机制,用于将密钥与任意按钮和标签相关联,这是“访问密钥”的概念。如果在ToggleButton上注册了一个“h”的访问键,按Alt-H将切换按钮,如果你没有TextBox或其他控件首先接受它,那么将只是简单的H.
在代码中注册访问密钥非常简单:
AccessKeyManager.Register("h", togleButton);
这会将“h”注册为访问文本。现在,如果用户在范围内的任何位置按Alt-H(如果没有TextBox处理,则按“h”),您的按钮将切换。
您也可以在XAML中执行此操作。如果您在按钮中显示文字,只需在访问密钥字母前使用下划线:
<Button Text="Show _History" ... />
如果您展示的不仅仅是文字,请在按钮内容中添加隐藏的AccessText元素:
<Button ...>
<Grid>
<AccessText Text="_h" Visibility="Collapsed" />
<Image ...>
</Grid>
</Button>
如果您想知道,WPF没有内置机制来请求AccessKey注册响应Ctrl而不是Alt,因此这不允许您将Ctrl-H设置为访问密钥。