用户控件InputBindings只有在先按下一个按钮后才能工作

13

按预期正常工作,通过点击按钮。

问题:当用户控件首次加载时,我没有在其中按任何按钮时,快捷键不起作用。手动点击按钮后快捷键会正常工作。因此,我希望让用户在按下任何按钮之前就可以使用快捷键 :)

(我已经尝试设置不同元素(如按钮本身)的焦点)

示例代码,说明我如何设置我的命令:(使用MVVM-light工具包)

ContextBinding

DataContext="{Binding GameInfoViewModel, Source={StaticResource Locator}}"

查看

<UserControl.InputBindings>
    <KeyBinding Key="Right" Command="{Binding NextCommand}"/>
</UserControl.InputBindings>
//...
<mui:ModernButton Name="ModernButtonNext" IconData="{StaticResource NextIcon}" Command="{Binding NextCommand}" Margin="16 0 0 0" EllipseDiameter="24" IconWidth="14" IconHeight="14" ToolTip="Next image"/>

视图模型

private RelayCommand _nextCommand;

/// <summary>
/// Gets the NextCommand.
/// </summary>
public RelayCommand NextCommand
{
    get
    {
        return _nextCommand ?? (_nextCommand = new RelayCommand(
            ExecuteNextCommand,
            CanExecuteNextCommand));
    }
}

private void ExecuteNextCommand()
{
    SelectedGameImageIndex += 1;
}

private bool CanExecuteNextCommand()
{
    if (SelectedGameImageIndex >= GameImages.Count - 1)
    {
        return false;
    }
    return true;
}

2
为了使KeyBinding起作用,您的窗口应该在焦点上。我怀疑窗口没有在焦点上。 - Rohit Vats
@RohitVats 我的应用是一个单窗口应用程序,它将UserControls作为视图加载。内容位于网格中。如果我在该网格中的任何位置放置一个空按钮(未绑定或其他),并单击它,则键绑定将起作用。 - Jim
1个回答

35

正如我在评论中提到的,控件应该拥有键盘焦点,这样才能对该控件进行按键绑定

在点击按钮时它可以工作,因为通过该点击,用户控件获得了焦点,因此在此之后绑定便可以起作用了。

在UserControl加载时,将键盘焦点放在UserControl上,以使输入绑定可用。您可以将此代码放在UserControl构造函数中:

    public SampleUserControl()
    {
        InitializeComponent();
        Focusable = true;
        Loaded += (s, e) => Keyboard.Focus(this);
    }
同样也可以通过XAML实现这一点(关键是在UserControl上设置Focusable为True):
<Window FocusManager.FocusedElement="{Binding ElementName=userControl}">
   <local:SampleUserControl x:Name="userControl" Focusable="True"/>
</Window>

完美运行!我在xaml中坚持太多,试图找出一些像FocusManager.FocusedElement = "{Binding ElementName = input}"这样的东西。非常感谢。 - Jim
好的,我也会尝试那种方法。 - Jim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接