【问题标题】:Keybindings without any focus没有任何焦点的键绑定
【发布时间】:2011-12-29 01:23:08
【问题描述】:

我有一个有六个按钮的 WPF 屏幕。我想将每个与键绑定相关联。它们都是通过 MVVM 驱动的 ICommand。

我目前将键绑定绑定到事件而不是实际按钮:

<UserControl.InputBindings>
        <KeyBinding Key="N"  Command="{Binding MyCommand}"/>

但是,要使任何键绑定起作用,我必须设置至少 1 个按钮来关注代码隐藏。我真的不想这样做,因为每个按钮/命令对于它是否处于活动状态都有不同的规则,而且我有我希望在页面加载时不活动的焦点动画。

这是可能的还是我必须设置焦点?

【问题讨论】:

    标签: wpf xaml c#-4.0 mvvm


    【解决方案1】:

    你只需要将 usercontrol 的 focusable 设置为 true,因为某些元素默认不设置为 true

    <UserControl Focusable="True">
    

    那么你必须在用户控件的加载事件中设置this.Focus()

    【讨论】:

    • 完美!我希望 adcool2007 的方法能够奏效,然后我就不会打开代码隐藏了。
    • 您仍然可以在 xaml 中执行此操作。使用 System.Windows.Interactivity 和 :Expression.Samples.Interactivity :Interaction.Triggers>
    • 效果很好,谢谢!并且让我们不要过于沉迷于不使用代码隐藏。这是一种严格意义上的 UI 并且属于它的情况(尽管上面的 interaction.triggers 也很好,但我只是倾向于在需要在视图模型中运行命令时使用它们)。
    【解决方案2】:

    您可能确实需要专注于某个元素才能使其工作,但也许您可以将注意力集中在整个 UserControl 上而无需视觉反馈?如果不起作用,您也可以尝试将焦点设置为不可见的元素。

    顺便说一句,这里之前似乎有一个类似的问题: WPF MVVM KeyBinding not being recognized right away and not always working

    【讨论】:

      【解决方案3】:

      您是在窗口中托管您的用户控件吗....是您可以使用的情况....

      <Window x:Class="GM.Powertrain.DOEMenu.ViewLayer.AboutScreen"
      Height="460" Width="370" 
      WindowStartupLocation="CenterScreen"
      ShowInTaskbar="False"
      HorizontalAlignment="Center" 
      VerticalAlignment="Center"
      ResizeMode="NoResize"      
      FocusManager.FocusedElement="{Binding ElementName=UserControlName}" 
                         Behaviors:WindowCloseOnEscapePressBehavior.EscapeClosesWindow="True" Behaviors:Help.Filename="Help/DOEMenuHelp.chm" Behaviors:Help.Keyword="About Screen">
      <UserControl Name=UserControlName>
         <KeyBinding Key="N"  Command="{Binding MyCommand}"/>
      </UserControl>
      </Window>
      

      您的键绑定应该以这种方式工作...

      【讨论】:

      • 嗯.. 是的,我正在使用内容控件并通过棱镜区域插入用户控件。但是我已经尝试在窗口和用户控件上将用户控件设置为焦点,但没有成功。我可能会尝试一个小型测试项目并使用这种方法。
      • 我很惊讶 FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}} 在实际的用户控件中不起作用。但是设置 this.Focus() 确实有效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多