使用图像内容设置ToggleButton的快捷键

Nid*_*ocu 7 data-binding wpf keyboard-shortcuts togglebutton

我创建了一个ToggleButton显示和隐藏UI的部分,我已将其发送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>
Run Code Online (Sandbox Code Playgroud)

Ray*_*rns 11

ToggleButton本身的InputBinding不会起作用,但有两个很好的WPF解决方案可以解决您的问题:

  1. 使用更新模型的RoutedCommand.
  2. 注册访问密钥.

为什么您的InputBinding解决方案无法正常工作

您当前定义的InputBinding将不起作用,因为它没有列出命令.创建一个切换按钮的命令很容易,如下所示:

public void Execute(object parameter)
{
  ((ToggleButton)parameter).IsChecked = !((ToggleButton)parameter).IsChecked;
}
Run Code Online (Sandbox Code Playgroud)

然而,这将无法实现您的目标.即使按钮没有聚焦,您也希望Ctrl-H切换按钮.InputBinding不会为您完成此操作,因为它仅在按钮具有焦点时才起作用.我现在将讨论您可以使用的两种解决方案.

Option 1: Use a RoutedCommand that updates the model

The whole point of WPF's architecture is that you never will need to "toggle a button" in the first place: Conceptually all keyboard and mouse actions in WPF should serve to toggle a bound property in your model or view model. The ToggleButton then just becomes the mechanism for accepting mouse clicks, but need not be the only one.

您为"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);
Run Code Online (Sandbox Code Playgroud)

这将"h"注册为访问文本.现在,如果用户在范围内的任何位置按Alt-H(如果未由TextBox处理,则显示为"h"),您的按钮将切换.

您也可以在XAML中执行此操作.如果您在按钮中显示文本,只需在访问密钥字母前使用下划线:

<Button Text="Show _History" ... />
Run Code Online (Sandbox Code Playgroud)

如果您正在显示除文本之外的其他内容,请在按钮内容中包含隐藏的AccessText元素:

<Button ...>
  <Grid>
    <AccessText Text="_h" Visibility="Collapsed" />
    <Image ...>
  </Grid>
</Button>
Run Code Online (Sandbox Code Playgroud)

如果您想知道,WPF没有内置机制来请求AccessKey注册响应Ctrl而不是Alt,因此这将不允许您将Ctrl-H设置为访问键.

  • 当可见性崩溃时,它似乎对我不起作用.但我尝试设置Opacity = 0而且效果很好! (2认同)