简体   繁体   中英

How do I disable dash + equals on a check box object in xaml?

I have a datatemplate xaml that currently looks like this for a report screen

   <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>

I want to know, how I can disable the default checkbox behavior that uses '-' and '=' as chek and uncheck.

I want to allow the user in that textbox to type in '1-5, 6, 7' for page ranges, but cannot do so because '-' is checking and unchecking the box

EDIT: I would like to maintain the spacebar functionality of checking + unchecking the checkbox. For whatever reason, if I am in the textbox and I type space, it doesn't trigger the toggle event, but the '-' and '=' do.

EDIT2: Ideally looking for a xaml fix since I am trying to maintain an MVVM architecture and would prefer not to have code behind

CheckBox.OnKeyDown is the culprit (see http://msdn.microsoft.com/en-us/library/system.windows.controls.checkbox.onkeydown.aspx ). I solved this by making a custom CheckBox class that overrides OnKeyDown and does nothing. The VB solution would look like:

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

You can use this class instead of CheckBox whenever you need the checkbox to ignore keyboard inputs.

As can be seen here CheckBox.cs source code in C# .NET , for 2-state checkboxes there is custom behaviour for Key.Add, Key.Subtract, Key.OemPlus, Key.OemMinus .

(Programmatically) adding commands didn't work for me. Overriding in a subclass did:

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;
  }
}

Try to override the keyboard shortcuts with empty commands:

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

And in your viewmodel:

// using System.windows.input

public Icommand EmptyCommand = ApplicationCommands.NotACommand;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM