3

我有一个数据模板 xaml,目前在报告屏幕上看起来像这样

   <CheckBox>
        <StackPanel>
            <TextBlock Text="{Binding Path=DisplayName}" FontWeight="Bold" Margin="0 0 0 5" />
            <RadioButton Content="All Pages" IsChecked="{Binding Path=AllPages}" Margin="0 0 0 5" />
            <RadioButton>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="Pages: " Margin="0 3 5 0" />
                    <TextBox Width="130" Text="{Binding Path=SelectedValue}" />
                </StackPanel>
            </RadioButton>
        </StackPanel>
  </CheckBox>

我想知道,如何禁用使用“-”和“=”作为检查和取消选中的默认复选框行为。

我想允许该文本框中的用户为页面范围输入“1-5、6、7”,但不能这样做,因为“-”正在选中和取消选中该框

编辑:我想保持选中+取消选中复选框的空格键功能。无论出于何种原因,如果我在文本框中输入空格,它不会触发切换事件,但 '-' 和 '=' 会触发。

EDIT2:理想情况下寻找 xaml 修复,因为我正在尝试维护 MVVM 架构并且不希望后面有代码

4

3 回答 3

3

CheckBox.OnKeyDown 是罪魁祸首(参见http://msdn.microsoft.com/en-us/library/system.windows.controls.checkbox.onkeydown.aspx)。我通过创建一个覆盖 OnKeyDown 并且什么都不做的自定义 CheckBox 类解决了这个问题。VB 解决方案如下所示:

Public Class IgnoreKeyboardCheckBox
    Inherits CheckBox

    Protected Overrides Sub OnKeyDown(e As System.Windows.Input.KeyEventArgs)
        If e.Key = Key.Space Then
            MyBase.OnKeyDown(e)
        End If
    End Sub
End Class

当您需要复选框忽略键盘输入时,您可以使用此类而不是 CheckBox。

于 2012-10-11T12:40:58.010 回答
1

可以在这里看到C# .NET 中的 CheckBox.cs 源代码,对于 2 状态复选框,有自定义行为Key.Add, Key.Subtract, Key.OemPlus, Key.OemMinus

(以编程方式)添加命令对我不起作用。在子类中覆盖确实:

protected override void OnKeyDown(KeyEventArgs e)
{
  // Non ThreeState Checkboxes natively handle certain keys.
  if (SuppressNativeKeyDownBehaviour(e.Key))
    return;

  base.OnKeyDown(e);
}

private bool SuppressNativeKeyDownBehaviour(Key key)
{
  switch (key)
  {
    case Key.Add:
    case Key.Subtract:
    case Key.OemPlus:
    case Key.OemMinus:
      return true;
    default:
      return false;
  }
}
于 2016-06-10T08:36:32.220 回答
0

尝试用空命令覆盖键盘快捷键:

<RadioButton>
        <KeyBinding Key="OemMinus" Command="{Binding EmptyCommand}"/>
</RadioButton>

在您的视图模型中:

// 使用 System.windows.input

public Icommand EmptyCommand = ApplicationCommands.NotACommand;
于 2012-07-10T11:40:31.333 回答